Дмитрий Радищев (dibr) wrote,
Дмитрий Радищев
dibr

time_t

     ilya_314 сообщает - проблемы с 61-й секундой на линуксе таки возникли :-) Ещё тут в комментах мне сообщили, что в линуксе есть поддержка leap seconds, а я предположил, что это вполне может привести к глюкам (хотя и не очень на это рассчитывал). Однако, "они смогли" :-)

     А мне вот что интересно. В стандартной библиотеке языка Си (далее libc) есть поддержка двух типов времени: "календарного" (вида "число-месяц-год-час-минута-секунда", удобно использовать при взаимодействии с пользователем или выяснении "ночь сейчас или день?!" - далее будем называть этот тип tm), и "линейного" (число секунд, прошедшее от "начала эпохи", удобно для хранения (это просто число) и расчёта промежутков времени - далее time_t). Разумеется, есть процедуры преобразования time_t в tm и обратно (для простоты забудем пока про местное время). Без учёта високосной секунды там всё тривиально - календарь известен на сотни лет вперёд, формула пересчёта известна и неизменна со времён появления этой самой libc :-)
     А теперь мы хотим поддержать високосную секунду. Секунда эта вводится "по мере возникновения потребности", расписать её на сто лет вперёд не получается, значит учёт каждой конкретной високосной секунды придётся делать "апдейтом" - явным изменением кода для учёта именно этой секунды. И возникает вопрос:
     А как оно там в линуксе-то сделано? Каждые несколько лет меняется формула пересчёта time_t в tm? Но тогда возможна куча спецэффектов - начиная с того, что в этом случае time_t этой системы будет отличаться от time_t систем, не учитывающих високосную секунду (винда, тот же линукс, но без апдейта для именно этой секунды), а значит time_t нельзя будет использовать для обмена информацией о времени; и заканчивая всякими банальностями вроде того, что в момент добавления високосной секунды изменится "чётность" секунд в time_t (например, чётная "секунда-в-минуте" будет соответствовать нечётному time_t), ну, или что добавив к time_t 3600 секунд - приложение может оказаться не "ровно через час отсюда", а "через час без одной секунды". Или процедура пересчёта "заморожена", а високосная секунда вводится только в виде появления "23:59:60" в tm? Но это вообще некорректно - тогда возникнет момент времени, который непредставим в time_t, со всеми вытекающими последствиями. И я понимаю, почему винда решила не париться, и все эти секунды не учитывать: погрешность в одну секунду мало кому важна, а кому реально важна - те вряд ли понадеются на поддержку системой, и поддержат это сторонними средствами.

     А на самом-то деле как оно в линуксе, интересно?..
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 5 comments