Как конвертировать строку в дату и время в секунды(число)

Konstanti999
Offline
Зарегистрирован: 03.08.2018
Здравствуйте.
Подскажите пожалуйста есть дата и время: 2018.08.03 21:21:40. как перевести данное время в число секунд. 
И необходима обратная операция из числа секунд в конкретное время, пример: 1555452584 => 03.08.2018, 21:21:40.
Использую библиотеку: #include <iarduino_RTC.h>
Устройство: iarduino_RTC time(RTC_DS1307); 
Ардуино UNO 1.8.5
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
Konstanti999
Offline
Зарегистрирован: 03.08.2018

Нашел, у родного брата GrishkoDE. Может кому пригодится к библиотеке #include <iarduino_RTC.h> Ардуино UNO 1.8.5long myFuncM(long xxx){ 

String str11 = String(xxx); 
str11.replace("-",""); 
return str11.toInt(); 
 
long myFunc(int den1, int mes1, int god1, int chas1, int min1, int sek1){ 
long sss = 0; 
long result = 0; 
result = (god1-1970)*31556926; 
result = myFuncM(result); 
sss=result; 
Serial.print("god1: "); Serial.println(result); 
result = (mes1-1)*2629743; 
result = myFuncM(result); 
sss=sss+result; 
Serial.print("mes1: "); Serial.println(result); 
result = (den1-1)*86400; 
result = myFuncM(result); 
sss=sss+result; 
Serial.print("den1: "); Serial.println(result); 
result = (chas1)*3600; 
sss=sss+result; 
Serial.print("chas1: "); Serial.println(result); 
result = (min1)*60; 
sss=sss+result; 
Serial.print("min1: "); Serial.println(result); 
result = (sek1); 
sss=sss+result; 
Serial.print("sek1: "); Serial.println(result); 
return sss; 
 
 
 
void setup() { 
Serial.begin(9600); 
// put your setup code here, to run once: 
Serial.print("sec: "); Serial.println(myFunc(10,8,2018,0,55,30)); 
 
 
void loop() { 
// put your main code here, to run repeatedly: 
 
}
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А что, готовыми функциями системной библиотеки (из time.h) воспользоваться религия не позволила?

Konstanti999
Offline
Зарегистрирован: 03.08.2018

ЕвгенийП пишет:

А что, готовыми функциями системной библиотеки (из time.h) воспользоваться религия не позволила?

Пришлось бы многое переделывать в проекте, поэтому и просил с этой библиотекой (#include <iarduino_RTC.h>)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Konstanti999 пишет:
Пришлось бы многое переделывать в проекте, поэтому и просил с этой библиотекой (#include <iarduino_RTC.h>)

Ни хре бы не пришлось. Просто вместо той портянки, что Вы волжили, Вы бы вставили вызов готовой системной функции, которая считает всё, что Вам нужно.

Konstanti999
Offline
Зарегистрирован: 03.08.2018

ЕвгенийП пишет:

Konstanti999 пишет:
Пришлось бы многое переделывать в проекте, поэтому и просил с этой библиотекой (#include <iarduino_RTC.h>)

Ни хре бы не пришлось. Просто вместо той портянки, что Вы волжили, Вы бы вставили вызов готовой системной функции, которая считает всё, что Вам нужно.

Наверно Вам более виднее, что мне удобнее, а все, что мне нужно, все считает и с этой портянкой и с этой библиотекой, как и писал в описании темы этого форума, Вам бы по внимательнЕЕ! 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Konstanti999 пишет:
Наверно Вам более виднее

Конечно, виднее. От Вашей любимой "iarduino_RTC.h" Вам никто отказываться не предлагал, просто вместо поортянки, для вычисления количества секунд, предлагали использовать системную функцию, которая а) раза в три быстрее; б) жрёт меньше памяти; и в) не содержит детских ошибок.

А так, конечно, если Вас устраивает цена на прошлогодний овёс, которую расчитывает та программа, так пользуйтесь на здоровье.

Konstanti999 пишет:
Вам бы по внимательнЕЕ
Не знаю, какова Ваша цель здесь. Но если цель - "чему-то научиться", то Вам бы повежливЕЕ :)

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

+++++++++++++++++++++++++++

Просьба к Александру!

Вычисти все с номера 2, плз.

В №1 Женя ответил на вопрос. Если оставить ту муть, что привел ТС, то мы получим "Если слепой ведет слепого, то оба упадут в яму!".

Нужно вообще ввести правило, после ответа специалистов, дальшейший флуд в темах убирать, ради тех чайников, которые потом это читать будут. Нужна ли дальшейшая дискуссия - пусть определяет ответивший специалист.... например, если не нужна - то пишем слово КОНЕЦ... или еще как-то.     ...дискутируемо.

 

b707
Offline
Зарегистрирован: 26.05.2017

wdrakula пишет:

Нужно вообще ввести правило, после ответа специалистов, дальшейший флуд в темах убирать, ради тех чайников, которые потом это читать будут. Нужна ли дальшейшая дискуссия - пусть определяет ответивший специалист.... например, если не нужна - то пишем слово КОНЕЦ... или еще как-то.     ...дискутируемо.

 

категорически против.

На самом деле треды с разным бредом ОЧЕНЬ ПОУЧИТЕЛЬНЫ - а также разные срачи на программисткую тему, если не слишком длинные. Программирование ценно тем, что практически любую вещь можно сделать десятком способов - и всегда полезно почитать спор на тему, какой способ лучше и почему все варианты бред и лишь один мой хороший :)

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

wdrakula пишет:

Нужна ли дальшейшая дискуссия - пусть определяет ответивший специалист....

У нас говорили на одной работе: "У двух штурманов - три мнения".

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:
и почему все варианты бред и лишь один мой хороший :)

Как почему? Потому что "мой"!

А вообще полезно читать как раз не срач, а когда более или менее вежливо спрашивают "а почему так?", тогда чаще всего объясняют. А когда сразу посылают типа "не умничай, меня и так всё устраивает", мало кто станет объяснять почему так лучше, а эдак хуже.
 
Но это я не к тому, что поддерживаю идею что-то тереть. Я вообще против удаления чего бы то ни было, кроме политоты, рекламы и откровенных личных выпадов.
Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

Konstanti999 пишет:

Нашел, у родного брата GrishkoDE. Может кому пригодится к библиотеке #include <iarduino_RTC.h> Ардуино UNO 1.8.5

long myFuncM(long xxx){ 

String str11 = String(xxx); 
str11.replace("-",""); 
return str11.toInt(); 
} 

long myFunc(int den1, int mes1, int god1, int chas1, int min1, int sek1){ 
long sss = 0; 
long result = 0; 
result = (god1-1970)*31556926; 
result = myFuncM(result); 
sss=result; 
Serial.print("god1: "); Serial.println(result); 
result = (mes1-1)*2629743; 
result = myFuncM(result); 
sss=sss+result; 
Serial.print("mes1: "); Serial.println(result); 
result = (den1-1)*86400; 
result = myFuncM(result); 
sss=sss+result; 
Serial.print("den1: "); Serial.println(result); 
result = (chas1)*3600; 
sss=sss+result; 
Serial.print("chas1: "); Serial.println(result); 
result = (min1)*60; 
sss=sss+result; 
Serial.print("min1: "); Serial.println(result); 
result = (sek1); 
sss=sss+result; 
Serial.print("sek1: "); Serial.println(result); 
return sss; 
} 



void setup() { 
Serial.begin(9600); 
// put your setup code here, to run once: 
Serial.print("sec: "); Serial.println(myFunc(10,8,2018,0,55,30)); 

} 

void loop() { 
// put your main code here, to run repeatedly: 

}

 

Вот всем торлько покритиковать! Простой и легкий код, тоже подобную задачу решаю.

Вопросы к Konstanti999:
1. не совсем понял, как время представленное строкой (2018.08.03 21:21:40) конвертуется в секунды? В коде работает только функция long myFunc, а myFuncM(long xxx) не выполняет то что от нее ожидалось.

2. учитывается ли високосный год в конвертации даты в секунды, и как потом из секунд опять получить дату вида 2018.08.03 21:21:40?

Буду очень признателен за разъяснение.

 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Andrey12,

Вы не поняли, всё гораздо смешнее.

Он преобразует дату не из строки, а из чисел г.м.д.ч.м.с. в unix-time. Високосность там конечно же не учитывается (ересь это).

А функция myFuncM - вообще шедевр, она реализует функцию abs следующим образом: преобразует число в String, там удаляет знак "-", а затем преобразует String обратно в число.  Почти сорок лет программирую, но такого ещё не видел. Это же поэзия!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ЕвгенийП пишет:

А функция myFuncM - вообще шедевр, она реализует функцию abs следующим образом: преобразует число в String, там удаляет знак "-", а затем преобразует String обратно в число.  Почти сорок лет программирую, но такого ещё не видел. Это же поэзия!

Это индусы так делают на шарпе. например, как проверить, что целое число меньше 10. Да просто преобразовать в строку и смотреть длину. Если == 1, то число от 0 до 9. 

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

ЕвгенийП пишет:

Andrey12,

Вы не поняли, всё гораздо смешнее.

Он преобразует дату не из строки, а из чисел г.м.д.ч.м.с. в unix-time. Високосность там конечно же не учитывается (ересь это).

А функция myFuncM - вообще шедевр, она реализует функцию abs следующим образом: преобразует число в String, там удаляет знак "-", а затем преобразует String обратно в число.  Почти сорок лет программирую, но такого ещё не видел. Это же поэзия!

Вот то то и оно, что убрав символы ": . -" из строки с датой временем, мы не получим количество секунд. 
И опять же, unix-time используется больше для совместимости, если писать маленький проект почему бы не использовать количество секунд с 01.01.2018 00:00:00?

А високосный год точно ересь :-) особенно если учесть что правило високосный год = год деленый на 4 без остатка это не аксиома.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Andrey12 пишет:
больше для совместимости, если писать маленький проект почему бы не использовать количество секунд с 01.01.2018 00:00:00?

Ему нужна совместимость с каким-то внешним источником.

Andrey12 пишет:

А високосный год точно ересь :-) особенно если учесть что правило високосный год = год деленый на 4 без остатка это не аксиома.

Конечно не аксиома,например 2100 год не будет високосным, и 1900 не был. Ересь - это весь григоринаский календарь со всеми его навроротами, не зря РПЦ на него не переходит :))) Вот смотрите:

1. тринадцатые числа месяца чаще приходятся на пятницу, чем на другие дни недели
2. при этом календарь ввёл Папа Григорий XIII

Думаете совпадение? Ересь в чистом виде! :)

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Andrey12 пишет:

Вот то то и оно, что убрав символы ": . -" из строки с датой временем, мы не получим количество секунд. 

да, нет, он не это убирает. Он берёт обыкновенное число (long n), преобразует его в String, убирает '-', если есть, и преобразует обратно в long. Получается |n| Во как!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

Это индусы так делают на шарпе. например, как проверить, что целое число меньше 10. Да просто преобразовать в строку и смотреть длину. Если == 1, то число от 0 до 9. 

Гениально! Сразу видно, что индусы - древнейшая и мудрейшая культура!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ЕвгенийП пишет:

DetSimen пишет:

Это индусы так делают на шарпе. например, как проверить, что целое число меньше 10. Да просто преобразовать в строку и смотреть длину. Если == 1, то число от 0 до 9. 

Гениально! Сразу видно, что индусы - древнейшая и мудрейшая культура!

Я тоже был ачарован.  Правда, потом пил 3 дня. 

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

DetSimen пишет:

Это индусы так делают на шарпе. например, как проверить, что целое число меньше 10. Да просто преобразовать в строку и смотреть длину. Если == 1, то число от 0 до 9. 

Гениально! Сразу видно, что индусы - древнейшая и мудрейшая культура!

да ладно смеятся, вы ничего не понимаете. Это вполне стандартный метод определения разрядности числа - переводим в строку и берем длину строки. Понятно, что когда речь идет о однозначных-двухзначных числах,  этот код выглядит нелепо - но это просто вопрос привычки. Если же числа могут быть, скажем, от 0 до 1000000 - метод через строку явно эффективнее числовых сравнений по диапазонам.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

b707 пишет:

ЕвгенийП пишет:

DetSimen пишет:

Это индусы так делают на шарпе. например, как проверить, что целое число меньше 10. Да просто преобразовать в строку и смотреть длину. Если == 1, то число от 0 до 9. 

Гениально! Сразу видно, что индусы - древнейшая и мудрейшая культура!

да ладно смеятся, вы ничего не понимаете. Это вполне стандартный метод определения разрядности числа - переводим в строку и берем длину строки. Понятно, что когда речь идет о однозначных-двухзначных числах,  этот код выглядит нелепо - но это просто вопрос привычки. Если же числа могут быть, скажем, от 0 до 1000000 - метод через строку явно эффективнее числовых сравнений по диапазонам.

Это всегда выглядит нелепо.

Цикл делений на 10 - основа преобразования в строку, если не нравятся сравнения, то сделай цикл делений, все ж быстрее будет

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:
Понятно, что когда речь идет о однозначных-двухзначных числах,  этот код выглядит нелепо - но это просто вопрос привычки. Если же числа могут быть, скажем, от 0 до 1000000 - метод через строку явно эффективнее числовых сравнений по диапазонам.

Простите, это Вы пошутили? У меня что-то сегодня с юмором напряг и никак понять не могу :)

Так-то сравнение раз в 50 быстрее работает, чем через String или через char[]. Я даже не поленился попробовать.

#include <Printing.h>

int digits1(const uint32_t n) {
	const String s(n);
	return s.length();
}

int digits2(const uint32_t n) {
	char buffer[12];
	ultoa(n, buffer, 10);
	return (int)strlen(buffer);
}

int digits3(const uint32_t n) {
	if (n > 999999999ul) return 10;
	if (n > 99999999ul) return 9;
	if (n > 9999999ul) return 8;
	if (n > 999999ul) return 7;
	if (n > 99999ul) return 6;
	if (n > 9999ul) return 5;
	if (n > 999ul) return 4;
	if (n > 99ul) return 3;
	if (n > 9ul) return 2;
	return 1;
}

void setup() { 
	Serial.begin(115200);
	uint32_t start, end;

	start = millis();
	for (long i = 0; i < 100002; i ++) PORTB = digits1(i);
	end = millis();
	printf("Through String: %lu\r\n", end - start);

	start = millis();
	for (long i = 0; i < 100002; i ++) PORTB = digits2(i);
	end = millis();
	printf("Through char[]: %lu\r\n", end - start);

	start = millis();
	for (long i = 0; i < 100002; i ++) PORTB = digits3(i);
	end = millis();
	printf("Through Comparison: %lu\r\n", end - start);
} 

void loop() {}

//	Результат:
//
//	Through String: 12079
//	Through char[]: 10066
//	Through Comparison: 193

Причём, заметьте, здесь небольшие чила - наихудший случай для сравнения, т.к. требуется максмиальное количество срванений.

b707
Offline
Зарегистрирован: 26.05.2017

ну хорошо, убедили :)

Зато функция digits1 аккуратнее всего выглядит в коде :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

аккуратнее всего выглядит в коде :)

Вы сейчас процитировали первый закон Скотта: "Неважно, что что-то идёт неправильно. Возможно, это хорошо выглядит" :))))

Кстати, есть ещё один поход, который выглядит ещё аккуратнее, а с точки зрения математики, та и логичнее:

int digits4(const uint32_t n) {
	return (int)log10(n) + 1;
}

 

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Кстати, есть ещё один поход, который выглядит ещё аккуратнее, а с точки зрения математики, та и логичнее:

int digits4(const uint32_t n) {
	return (int)log10(n) + 1;
}

 

издеваетесь? сколько килобайт математических библиотек притащит с собой один вызов логарифма? :)

sadman41
Offline
Зарегистрирован: 19.10.2016

Просто затроллил по теме стринга.

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Просто затроллил по теме стринга.

кто кого?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

издеваетесь? сколько килобайт математических библиотек притащит с собой один вызов логарифма? :)

Но выглядит-то симпатично! Сами только что закон Скотта цитировали! :)