|
| |||
|
|
time_t ilya_314@lj сообщает - проблемы с 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, со всеми вытекающими последствиями. И я понимаю, почему винда решила не париться, и все эти секунды не учитывать: погрешность в одну секунду мало кому важна, а кому реально важна - те вряд ли понадеются на поддержку системой, и поддержат это сторонними средствами. А на самом-то деле как оно в линуксе, интересно?.. |
||||||||||||||