mktime () возвращает огромное количество секунд - PullRequest
0 голосов
/ 22 февраля 2019

В простом тесте, показывающем истекшее время в секундах с начала эпохи де Unix (01.01.1970 00:00:00 UTC) до 22 февраля 2019 года, было возвращено огромное число 18446744072104596016

Почему бы не просто 1550793600 секунд?

Не является ли значение time_t переносимым?


tm struct, напечатанный в консоли gdb, имел следующие значения непосредственно перед вызовом mktime():

(gdb) p ltm
$4 = {tm_sec = 0, tm_min = 0, tm_hour = 0, tm_mday = 22, tm_mon = 1, tm_year = 19, tm_wday = 0, tm_yday = 0, tm_isdst = 0}

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Учитывая

tm_year = 19

, вы неправильно используете mktime(), если ожидаете, что этот ввод будет представлять 2019 год.

За 7.27.1 Компонентывремя , параграф 4 стандарта C:

Структура tm должна содержать как минимум следующие элементы в любом порядке.Семантика элементов и их нормальные диапазоны выражены в комментариях.

     int    tm_sec;           //   seconds after the minute -- [0, 60]
     int    tm_min;           //   minutes after the hour -- [0, 59]
     int    tm_hour;          //   hours since midnight -- [0, 23]
     int    tm_mday;          //   day of the month -- [1, 31]
     int    tm_mon;           //   months since January -- [0, 11]
     int    tm_year;          //   years since 1900
     int    tm_wday;          //   days since Sunday -- [0, 6]
     int    tm_yday;          //   days since January 1 -- [0, 365]
     int    tm_isdst;         //   Daylight Saving Time flag

Обратите внимание, что значение tm_year равно , обозначенное в годах с 1900 .

Скорее всего, вы получите значение time_t за 22 февраля 1919 года, которое равно -1604966400 или 18446744072104596016 без знака.

0 голосов
/ 22 февраля 2019

В двоичном коде 18446744072104596016 равен 11111111111111111111111111111111111111111111110100000010101100101001000110000 с 64 битами

, вероятно, вы используете отрицательное значение -1604955598 в качестве значения без знака

...