Изменяются ли временные метки Unix в разных часовых поясах?
Как субъект спрашивает; метки времени UNIX меняются в каждом часовом поясе?
Например, если я отправлю запрос на другое электронное письмо с другой стороны мира, говорящее: "Отправьте электронное письмо, когда время 1397484936", будет ли временная метка другого сервера отставать от моей собственной на 12 часов?
7 ответов
Определение метки времени UNIX не зависит от часового пояса. Временная метка - это количество секунд (или миллисекунд), прошедшее с абсолютного момента времени, полуночи 1 января 1970 года по времени UTC. (UTC - это среднее время по Гринвичу без корректировки на летнее время.) Независимо от вашего часового пояса, отметка времени представляет момент, который везде одинаков. Конечно, вы можете конвертировать туда и обратно в местный часовой пояс (время 1397484936 такое-то местное время в Нью-Йорке или другое местное время в Джакарте), если хотите.
Статья на http://en.wikipedia.org/wiki/Unix_time впечатляет, если вы хотите больше читать.
Время Unix определяется как количество секунд, прошедших с 00:00:00 всемирного координированного времени (UTC), четверг, 1 января 1970 года. Таким образом, ответ - нет
Временные метки Unix не меняются в зависимости от часовых поясов, они созданы для того, чтобы иметь стандартное время по всему земному шару.
ПРИМЕЧАНИЕ. - Метки времени рассчитываются на основе текущего времени в компьютере, поэтому не полагайтесь на них до тех пор, пока вы не будете уверены в настройках времени участвующих компьютеров.
Кто-то заявил, что "UTC - это среднее время по Гринвичу без учета перехода на летнее время". Это просто неправда. В GMT нет летнего времени. GMT измеряется в Гринвиче, Англия (в военно-морской обсерватории) [0 долготы, но не 0 широты]. UTC измеряется на экваторе [0 долготы и 0 широты - которые лежат в океане за пределами Африки).
Что это меняет? Это не имеет значения с точки зрения "который час дня?" Это, однако, имеет значение с точки зрения расчета года. Теперь вы думаете, что год будет измеряться в зависимости от местоположения центра (ядра) Земли, верно? Когда ядро Земли вернулось в то же место, которое было ~365 дней назад, это был год. Это не измеряется таким образом. Он измеряется определенным местоположением на Земле, возвращающимся в то же место (относительно Солнца), что было ~365 дней назад. Но период дня и года не делятся поровну. Как только Земля вернется туда, где она была год назад, Земля уже не будет смотреть в том же направлении, что и в прошлом году, так что точка на земле не будет смотреть в том же направлении, что и год назад. Будучи дальше на север, Гринвич не собирается возвращаться в то же место (относительно Солнца), что было в прошлом году в то же время, что и 0 Лат / 0 Лонг. Поэтому, если вы основываете определение на Гринвите против 0/0, вы получите, хотя и немного, другой ответ на вопрос "сколько дней в году". Иными словами, когда данное место на земле возвращается туда, где оно было год назад (относительно Солнца), ядро Земли не находится в том же месте, что и год назад, так что это за место? Вы выбираете вещи, потому что ядро Земли будет находиться в другом месте (относительно Солнца), чем это было год назад, если вы выберете другое место на Земле.
Ни UTC, ни GMT не имеют летнего времени. Европа / Лондонское время, часовой пояс, в котором проживает Гринвич, делает. Но по Гринвичу нет. GMT - это то, что американцы называют "стандартным временем", то есть без DST.
Возвращаясь к вопросу, время эпохи технически не имеет часового пояса. Он основан на конкретном моменте времени, который, как оказалось, совпадает с "четным" временем UTC (в начале года, десятилетия и т. Д.). Если эта концепция не вписывается в ваш мозг, и если она помогает думать о времени эпохи как о времени UTC, продолжайте. Вы в хорошей компании и по большому счету, это действительно не имеет значения. Вы когда-либо видели те судебные иски, где somoene присуждается 1 доллар. Это своего рода приговор типа "ты прав, но это не имеет значения". Если кто-то подаст в суд на вас за то, что вы сказали, что Epoch time находится в часовом поясе UTC, он выиграет 1 доллар. Это не купило бы им чашку кофе в любом Starbucks в любом часовом поясе на планете.
Если оба компьютера настроены правильно, их часы настроены на правильный часовой пояс и значения UTC, они должны возвращать одно и то же значение.
Конечно, это большой ЕСЛИ. Разница между временем, сообщаемым двумя компьютерами, почти наверняка составляет не менее секунды, а чаще - минуты. И многие компьютеры настроены на неправильные настройки часового пояса, и будут сообщать свое местное время, когда будет задана отметка времени, а не UTC.
И в этом заключается разница между теорией и практикой. В теории это все то же самое, на практике вы никогда не должны полагаться на это.
Я просто делюсь своими мыслями по этому поводу и, пожалуйста, поправьте меня, если я ошибаюсь.
Одной метки времени недостаточно для преобразования любой метки времени в DateTime определенного часового пояса. Нам нужна временная метка && часовой пояс, чтобы преобразовать временную метку в дату и время желаемого часового пояса.
- Преобразовать временную метку в локальную дату и время.
- Получите время UTC из местного времени DateTime и часового пояса (проверьте настройку часового пояса вашего сервера, где были сгенерированы эти данные временной метки)
- Получив время UTC, вы можете преобразовать его в любую дату и время определенного часового пояса. Например, Сидней на 10 часов опережает время UTC. Если часовой пояс сервера = UTC, просто добавьте/вычтите эти часы (не забудьте преобразовать эти часы в секунды) из данных вашей временной метки в соответствии с желаемым часовым поясом.
Таким образом, вам нужно знать как временную метку, так и информацию о часовом поясе, чтобы преобразовать ее в DateTime желаемого часового пояса.
Нет, временная метка эпохи не должна меняться, потому что она имеет фиксированный часовой пояс, который является UTC.
Если вы хотите использовать объект времени в другом часовом поясе, просто найдите его в библиотеках используемого вами языка, но НЕ пытайтесь добавить/вычесть пару часов из временной метки эпохи и предположить, что он находится в другом часовом поясе, который сделать вещи очень запутанными для других людей, особенно когда вы раскрываете это в своем API.
Если вы используете C++, я рекомендую эту библиотеку. Я слышал, что скоро он будет добавлен в стандартную библиотеку.
Для всех я понимаю, что иногда с объектом времени трудно иметь дело, и кажется, что проще добавить/подстроить временную метку эпохи. Пожалуйста, не делайте этого и не убеждайте других делать это. Объект времени намного проще, когда вы привыкнете к нему и сможете легко позаботиться о преобразовании часового пояса, не путаясь с историческими изменениями часового пояса из-за политики/закона и т. д.