Я уже писал, что занимаюсь проблемой 2038-го года. В сязи с этим вспомнил и узнал несколько забавных фактов.
Угадайте:
Ответы:
UPD: Оказывается, в coreutils есть обработка ситуации, когда mktime возвращает значение (time_t)-1 (см. lib/parse-datetime.c):
Так же читайте в моём блоге: Критическая статья о Boost Date-Time library и std::pair vs. std::swap.
Угадайте:
- Каков диапазон целочисленных значений, который может принимать переменная типа time_t?
- Какое значение возвращает функция mktime для идентификации ошибки?
- Какое значение вернёт функция mktime, если передать ей отрицательный день или 14-й месяц?
Ответы:
- Практически все целочисленные значения знакового типа; т.е. 315576000 – это 12:00:00 первого января 1980-го года по Гринвичу, а -315576000 – первое января 1960-го, и т.д.
- Как и многие другие функции из того же набора, mktime возвращает (time_t)-1 (как ftok возращает (key_t)-1, а getsid - (pid_t)-1).
- Для меня показалось это странным, но -2 января 1980-го или 4-ое число 14-го месяца 1990-го – то вполне нормальные значения для передачи их mktime, не будет ошибки; эта функция "трактует" эти данные логически: -2 день – это два дня назад, соответственно, 14-й месяц – это два месяца после декабря (14=12+2), т.е. февраль.
UPD: Оказывается, в coreutils есть обработка ситуации, когда mktime возвращает значение (time_t)-1 (см. lib/parse-datetime.c):
Guard against falsely reporting errors near the time_t boundaries when parsing times in other time zones.
For example, suppose the input string "1969-12-31 23:00:00 -0100", the current time zone is 8 hours ahead of UTC, and the min time_t value is 1970-01-01 00:00:00 UTC.
Then the min localtime value is 1970-01-01 08:00:00, and mktime will therefore fail on 1969-12-31 23:00:00.
To work around the problem, set the time zone to 1 hour behind UTC temporarily by setting TZ="XXX1:00" and try mktime again.
Так же читайте в моём блоге: Критическая статья о Boost Date-Time library и std::pair vs. std::swap.
no subject
Date: 2008-03-03 11:02 am (UTC)no subject
Date: 2008-03-03 11:16 am (UTC)minutes, 0 seconds, January 1, 1970, Coordinated Universal Time, without
including leap seconds. If an error occurs, time() returns the value
(time_t)-1.
The return value is also stored in *tloc, provided that tloc is non-null.
time_t - это unsigned int, на 64-х битных платформах (по-крайней мере на некоторых) он 8 байт. Поэтому я не очень понимаю, какую именно проблему ты решаешь :-)
PS: в ЖЖ действительно нельзя поставить время дальше 2038 года, это я уже давно заметил.
time_t - это unsigned int, на 64-х битных платформах (по-крайней ме
Date: 2008-03-03 12:09 pm (UTC)Re: time_t - это unsigned int, на 64-х битных платформах (по-крайней
Date: 2008-03-03 04:26 pm (UTC)no subject
Date: 2008-03-03 11:17 am (UTC)Сомтрите ИщО ою моську!
Date: 2008-03-03 12:13 pm (UTC)