2014-09-03 6 views
5

В настоящее время наше приложение использует локальное время, а не UTC. Я знаю, что очень важно использовать UTC, но не могу за всю жизнь помнить, почему.Почему я должен использовать UTC?

Предполагая, что DateTimes хранятся со смещением при сравнении местного времени с временем UTC или с другим временем с другим часовым поясом, конечно, любая используемая библиотека будет знать о разных часовых поясах и мутировать два объекта в что можно сравнить?

До тех пор, пока смещение передается с помощью DateTime (которое, как говорят, использует объекты, а не строки), я не понимаю, почему это имеет значение. Почему я должен иметь дело с 2014-09-01T13:44:13+00:00, а не 2014-09-01T14:44:13+01:00? Фактически, сохранение в виде UTC теряет информацию о смещении (местное время, когда было объявлено время).

Что мне здесь не хватает?

Контекст: У нас есть ограничения, связанные с ошибками стиля, и я подумал «аха: переместите все вещи в UTC», но потом понял, что я просто просматриваю код, преобразующий кучу объектов DateTime использовать часовой пояс UTC, и это показалось мне пустой тратой времени.

+0

Идите, найдите библиотеки, которые понимают часовые пояса ... отчитайтесь. Ваша предпосылка «наверняка любая библиотека, которая стоит использовать, будет знать о разных часовых поясах», не обязательно действительна. Какой язык (ы) вы рассматриваете? (Вопрос, не связанный с языком реализации, может не получить столько внимания, как все это: есть 179, которые следуют за «datetime» и 10, которые следуют «utc».) –

+0

@JonathanLeffler Пока я согласен с этим вниманием, этот вопрос совершенно независим на любом языке. –

+0

Некоторые детали в [DateTime vs DateTimeOffset] (http://stackoverflow.com/a/14268167/634824) могут помочь в понимании - но они в основном относятся к 'DateTimeOffset'. Основные случаи, связанные с локальными датами, возникают, когда вы не имеете смещения. –

ответ

5

Ваш прецедент позволяет хранить местное время со смещением. IMO нет необходимости хранить в UTC, так как вы всегда можете перевести момент времени в любое другое местное время. На самом деле это дает вам еще больше, поскольку у вас есть дополнительная информация о местном времени.

Технически есть преимущество в сохранении даты как UTC и смещения отдельно: вы можете сортировать строку, которая дает вам преимущество, например. DBS, которые должным образом не поддерживают даты с смещениями (например, MySQL).

Если вы рассматриваете системы, которые не позволяют хранить смещение, актерам придется согласовать общий часовой пояс. UTC представляется очень стабильным кандидатом с хорошей поддержкой перевода времени.

Одним из примеров этого является Exif, где вы можете сохранить только локальную дату без информации о часовом поясе. Другим примером является аппаратные часы на компьютере с несколькими ОС. Если актеры не согласны с общим часовым поясом, у вас появятся головные боли (Linux & Windows может стать забавной во время переключения DST).

+0

Пункт об индексировании находится на месте. Но имейте в виду, что некоторые базы данных поддерживают сохранение даты, времени и смещения в одном значении (обычно называемом 'datetimeoffset' или' timestamp с часовым поясом') - и в этих случаях платформа db сама будет конвертировать в UTC по мере ее сборки индекс. –

+0

Пример Exif намного более прямой. Есть много других подобных случаев, когда вы должны соответствовать одному дате + поле времени и не можете хранить смещение. +1 –

+0

Спасибо за ваш ответ.Мой вопрос состоял в том, что у нас есть ограничения, поэтапные ошибки стиля, и я подумал «ага: переместите все вещи в UTC», но потом понял, что я просто просматриваю код, конвертирующий кучу объектов DateTime, чтобы использовать Часовой пояс UTC, и это показалось мне пустой тратой времени. Есть ли у вас какие-либо мнения о том, как данные должны обрабатываться в коде (а не на стороне хранения вещей)? – sennett

4

Есть две причины, по которым я храню время как UTC.

Во-первых, это то, что с глобальными пользователями некоторых из приложений, над которыми я работаю, местное время зависит от пользователя, поэтому местное время для пользователя, который вводит данные, может быть не местным временем для пользователя, просматривающего данные позже.

Во-вторых, временные изменения. Они подчиняются прихотям правительств. То, что UTC +5 сегодня может быть завтра UTC +6, просто потому, что некоторые правительства говорят так, что затем сделает локальное время + смещение отличным от того, что было сохранено. Вы всегда можете определить правильное местное время, но я просто рассматриваю его как большую работу, чем просто преобразование UTC в локальный.

Это лучшие причины, которые я знаю для использования UTC, но я уверен, что есть другие, о которых я не думал.

+1

'2014-09-01T14: 44: 13 + 0100' всегда будут представлять один и тот же момент времени, независимо от того, что говорят правительства. –

+0

@MarkusMalkusch Это тот же момент времени, но вам нужно сделать немного больше работы, чтобы отобразить его по местному времени. Я отредактирую свой пост, чтобы отменить это. Спасибо, что указали это. –

+0

@MarkusMalkusch - После того, как он прошел * да. Но к моменту Ник нельзя предположить, что смещение для этой метки времени будет тем же самым смещением для другого, или для будущих временных меток, которые правительство не изменит своего мнения между «сейчас» и меткой времени. Но это больше аргумент в пользу использования полного часового пояса вместо смещения - не для использования UTC. –

1

Я думаю, что лучше всего хранить DATETIME + Offset

Дело в том, вы должны всегда хранить DateTime либо в UTC или в зачёт, но никогда не магазин DateTime «местный ориентированный», или без смещения. Иными словами:

Лучшее! DateTime + компенсировали

2014-09-03 11:36:07 EDT -04:00 

Хорошо UTC:

2014-09-03 15:36:07 UTC 

Veryyyyy плохо: DateTime нет смещения

2014-09-03 11:36:07 

Например, это может случится, если вы на самом деле не уход за часовым поясом и в конце предыдущего времени может быть сохранен как:

2014-09-03 11:36:07 UTC 

Теперь, в зависимости от структуры языка, это может случится, что вы, возможно, потребуется преобразовать ваш DateTime/Смещение в чем-то другом, но мой совет хранить всегда в качестве первой формы ....

Смежные вопросы