[personal profile] dememax
Я уже писал, что занимаюсь проблемой 2038-го года. В сязи с этим вспомнил и узнал несколько забавных фактов.
Угадайте:
  1. Каков диапазон целочисленных значений, который может принимать переменная типа time_t?
  2. Какое значение возвращает функция mktime для идентификации ошибки?
  3. Какое значение вернёт функция mktime, если передать ей отрицательный день или 14-й месяц?

Ответы:
  1. Практически все целочисленные значения знакового типа; т.е. 315576000 – это 12:00:00 первого января 1980-го года по Гринвичу, а -315576000 – первое января 1960-го, и т.д.
  2. Как и многие другие функции из того же набора, mktime возвращает (time_t)-1 (как ftok возращает (key_t)-1, а getsid - (pid_t)-1).
  3. Для меня показалось это странным, но -2 января 1980-го или 4-ое число 14-го месяца 1990-го – то вполне нормальные значения для передачи их mktime, не будет ошибки; эта функция "трактует" эти данные логически: -2 день – это два дня назад, соответственно, 14-й месяц – это два месяца после декабря (14=12+2), т.е. февраль.
Оставляю на ваше усмотрение вопрос, что будет, если передать функции localtime значение -1.

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.

Date: 2008-03-03 11:02 am (UTC)
From: [identity profile] mansch.livejournal.com
приведет к запуску крылатых ракет!

Date: 2008-03-03 11:16 am (UTC)
From: [identity profile] itman.livejournal.com
The time() function returns the value of time in seconds since 0 hours, 0
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 года, это я уже давно заметил.

Date: 2008-03-03 11:17 am (UTC)
From: [identity profile] childrengarden.livejournal.com
а мы с детьми очень рады видеть вою моську на боооооольшом мониторе
From: [identity profile] itman.livejournal.com
Я тебе прислал результат с 64-х битной платформы. По поводу знаковости: напечатай typeid.name() и сравни с unsigned int и signed int

Profile

dememax

May 2023

S M T W T F S
 123456
78910111213
14151617181920
21 2223 24252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 4th, 2026 12:31 pm
Powered by Dreamwidth Studios