localtime - выполнение одного за другим - разное time_t, но с одинаковыми результатами
Когда я пытаюсь сопоставить 2 значения time_t
, я получаю необъяснимое поведение
time_t t = 12345;
time_t T = 67890;
struct tm *tm = localtime(&t);
struct tm *Tm = localtime(&T);
char timeStamp[40];
sprintf(timeStamp, "(1) %04d-%02d-%02d %02d:%02d:%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
Serial.println(timeStamp);
sprintf(timeStamp, "(2) %04d-%02d-%02d %02d:%02d:%02d", Tm->tm_year + 1900, Tm->tm_mon + 1, Tm->tm_mday, Tm->tm_hour, Tm->tm_min, Tm->tm_sec);
Serial.println(timeStamp);
Я получаю точно такую же дату.
При комментировании одного из каждого набора я получаю правильный ответ для каждого.
Обходной путь, который я сделал, был, но я уверен, что есть элегантный способ обойти это:
time_t t = 12345;
time_t T = 12345;
struct tm *tm = localtime(&t);
uint8_t now_month = tm->tm_mon;
uint8_t now_day = tm->tm_mday;
struct tm *Tm = localtime(&T);
uint8_t save_month = Tm->tm_mon;
uint8_t save_day = Tm->tm_mday;
if (now_month == save_month && now_day == save_day)
{
}
@Guy . D, 👍-1
1 ответ
Лучший ответ:
Из справочной страницы localtime()
(выделено мной):
Функции
asctime()
,ctime()
,gmtime()
иlocaltime()
должны возвращать значения в одном из двух статических объектов: время в разбивке структуру и массив типаchar
. Выполнение любого из функции могут перезаписывать информацию, возвращаемую в любой из этих объектов любой из других функций.
В качестве решения я предлагаю вам взять копию struct tm
, используемую
localtime()
для сохранения результата, а не указателя на него:
struct tm tm = *localtime(&t);
struct tm Tm = *localtime(&T);
- Как справиться с rollover millis()?
- Как получить текущее время и дату в Arduino без внешнего источника?
- Преобразование в Unix Timestamp и обратно
- Как запустить цикл на определенное время?
- Почему мои часы реального времени показывают неверное время с моего ПК?
- Разница между «time_t» и «DateTime»
- Точность часов времени Arduino
- Как преобразовать время EPOCH во время и дату на Arduino?
Ну, как-то я пропустил эту строку, когда искал ответ. Я не понимаю, как им удалось натянуть такой плохой дизайн (или на то есть причина).... У меня шокированный вид, как на вашей пользовательской картинке :) TNX!, @Guy . D
@guyd это старый API языка C, @Juraj