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)
        {
        }

, 👍-1


1 ответ


Лучший ответ:

1

Из справочной страницы localtime() (выделено мной):

Функции asctime(), ctime(), gmtime() и localtime() должны возвращать значения в одном из двух статических объектов: время в разбивке структуру и массив типа char. Выполнение любого из функции могут перезаписывать информацию, возвращаемую в любой из этих объектов любой из других функций.

В качестве решения я предлагаю вам взять копию struct tm, используемую localtime() для сохранения результата, а не указателя на него:

struct tm tm = *localtime(&t);
struct tm Tm = *localtime(&T);
,

Ну, как-то я пропустил эту строку, когда искал ответ. Я не понимаю, как им удалось натянуть такой плохой дизайн (или на то есть причина).... У меня шокированный вид, как на вашей пользовательской картинке :) TNX!, @Guy . D

@guyd это старый API языка C, @Juraj