Некоторые замечания о времениUTC: время на нулевом меридиане называется Всемирное координированное время, Universal Coordinated Time. Несовпадение акронима было вызвано необходимостью универсальности его для всех языков.GMT: ранее вместо UTC использовалось среднее время по Гринвичу (Greenwich Mean Time, GMT), так как нулевой меридиан был выбран так, чтобы проходить через Гринвичскую королевскую обсерваторию.Прочие часовые пояса могут быть записаны как смещение от UTC. Например, Австралийское восточное стандартное время (EST) записывается как UTC+1000, то есть время 10:00 по UTC есть 20:00 по EST того же дня.Летнее время не влияет на UTC. Это всего лишь политическое решение смены часового пояса (смещения от UTC). Например, GMT всё ещё используется: это британское национальное время зимой. Летом оно становится BST.Високосные секунды: по международному соглашению, UTC держится в не более чем 0,9 секунды от физической реальности (UT1, которое измеряется по солнечному времени) путём введения «високосной секунды» в конце последней минуты года по UTC или последней минуты июня.Високосные секунды не обязаны объявляться (астрономами) более чем за 6 месяцев до их введения. Это представляет собой проблему, если вам требуется какое-либо планирование с секундной точностью на протяжении более 6 месяцев.Время Unix: измеряется количеством секунд, прошедших с «эпохи» (начало 1970 года по UTC). На время Unix не оказывают влияния часовые пояса или летнее время.Согласно стандарту POSIX.1, для времени Unix предполагается обрабатывать високосную секунды путём повторения предыдущей секунды, например: 59.00
59.25
59.50
59.75
59.00 ← повтор
59.25
59.50
59.75
00.00 ← инкремент
00.25Это компромисс: вы не можете как-либо выразить високосную секунду в ваших системных часах и ваше время гарантированно пойдёт в обратную сторону. С другой стороны, каждый день равен в точности 86 400 секундам, и вам не понадобится таблица всех прошлых и будущих високосных секунд для того, чтобы перевести Unix-время в удобную для человека форму часы-минуты-секунды.Предполагается, что ntpd произведёт повтор после того, как получит «високосные биты» от вышестоящих серверов времени, но я также видел и то, как он не делает ничего: система переходит на одну секунуду в будущее, затем медленно сползает обратное на правильное время.Что должен знать о времени каждый программистЧасовые пояса относятся к уровню презентации
Большинство вашего кода не должно заниматься часовыми поясами или местным временем, оно должно передавать Unix-время как оно есть.Когда измеряете время, измеряйте Unix-время. Это UTC. Его просто получить (системными функциями). Оно не имеет часовых поясов или летнего времени (и високосных секунд).Когда храните время, храните Unix-время. Это одно число.Если вы хотите сохранить время, пригодное для чтения человеком (например, в логах), постарайтесь сохранить его вместе с Unix-временем, а не вместо.Когда отображаете время, всегда включайте в него смещение часового пояса. Формат времени без смещения бесполезен.Системные часы не точны.Вы в сети? Системные часы каждой другой машины не точны по-разному.Системные часы могут, и будут, перепрыгивать вперёд и назад во времени из-за вещей, которые вне вашего контроля. Ваша программа должна быть разработана таким образом, чтобы пережить это.Отношение количества секунд системных часов к количеству настоящих секунд — не точно и может меняться. В основном это зависит от температуры.Не используйте слепо gettimeofday(). Если вам нужны монотонные (постоянно увеличивающиеся) часы, посмотрите на clock_gettime(). [Вариант для Java: вместо System.currentTimeMillis()используйте System.nanoTime()]ntpd может изменять системное время двумя способами:Шаг: часы перескакивают вперёд или назад к правильному времени немедленноПодкручивание: изменение частоты системных часов так, чтобы они медленно сдвигались в сторону правильного времени.Подкручивание более предпочтительно, потому что оно менее разрушительно, но полезно только для корректировки небольшой разницы.Специальные случаиВремя проходит со скоростью одну секунду за секунду для всех наблюдателей. Частота удалённых часов по отношению к наблюдателю зависит от скорости и гравитации. Часы внутри спутников GPS регулируются для преодоления эффектов относительности.MySQL хранит столбцы типа DATETIME в виде упакованных в числа значений «YYYYMMDD HHMMSS» Если вы озаботились хранением отметок времени, храните их как целое число и используйте для преобразования функции UNIX_TIMESTAMP() и FROM_UNIXTIME(). время, часовые пояса, летнее время, как сложно жить