2009-01-26 4 views
7

Я разрабатываю международное программное обеспечение, которое выступает в качестве простого программного обеспечения для управления проектами, и я столкнулся с проблемой. Эта проблема связана с датой/часом и часовым поясом.
Когда сообщение отправляется из одного часового пояса в другой часовой пояс, я могу хранить время UTC (GMT) в моей базе данных, а затем показывать его по-разному в соответствии с часовым поясом пользователя. Но это невозможно, когда я работаю только с датой.
Если я скажу, что задача должна состояться 21 марта. Должен ли я считать, что эта дата может быть 20 или 22 в некоторых других странах? Каковы ваши советы по этой проблеме?Как обрабатывать дату и время в разных часовых поясах?

+0

Могу ли я поместить бесстыдный штепсель для моего собственного связанного (но другого) вопроса о том, как проверить правильность обработки часового пояса? http://stackoverflow.com/questions/477965/testing-correct-timezone-handling –

+1

Вам нужно найти забаву, что если вы будете искать в тегах «локализация» или «интернационализация», вы получите только два вопроса, но если вы ищете «локализацию» или «интернационализацию», вы получаете кучи! – Evan

ответ

4

Предположим, что пользователь в Нью-Йорке устанавливает дату для проекта как «в любое время в понедельник 26 января». Это означает «в любое время с 06:00 с понедельника с 26 января по 06 час. 00 мин. Вторник, 27 января» в Брюсселе и «в любое время с 2000 года в воскресенье, 25 января 2000 года, понедельник, 26 января» в Лос-Анджелесе

Итак, завершение задачи в 21 час. и Нью-Йорк, но слишком поздно в Лос-Анджелесе

Одна возможная работа вокруг никогда не работает с датой. Если время не указано, установите его в течение 0000 часов или 2400 часов в дату, указанную в часовом поясе пользователя.

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

2

Вы не сможете достичь того, что вы пытаетесь сделать, не сохраняя точное время. Вам просто не хватает информации.

2

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

+0

Конец дня в UTC будет неточным для человека, назначающего дату выполнения (если, конечно, они уже живут в времени ZULU). – officemonkey

+0

@officemonkey - вот почему это было не мое первое предложение. Я полагаю, что лучше выбрать конец рабочего дня по местному времени и настроить его для всех остальных. Это, вероятно, имеет наибольший смысл для человека, входящего в задачу. Я отрегулирую ответ. – tvanfosson

+0

Конец бизнеса слишком расплывчато. –

1

Самое простое решение - это показать только одну дату для всех. В таком случае крайний срок будет в полночь в последнем часовом поясе.

В противном случае определите, какое время по умолчанию для конечного срока должно быть в часовом поясе, в котором была создана задача, например. 21 марта 17:00 EST или 22 марта 00:00 EST и отобразите это в местном часовом поясе. Разница в часовом поясе затем подталкивает ее к предыдущему или следующему дню соответственно для зрителя.

0

Если у вас есть один экземпляр БД, я бы сохранил все даты в метке времени datetime вашего сервера БД. Если вы ставите метки времени, рассмотрите GetDate() в T-SQL или в качестве значения по умолчанию столбца даты с меткой времени. Тогда у вас есть единственная контрольная точка на все времена. Рассмотрите формат UTC.

Затем все клиенты, обращающиеся дату делают свое превращение в «местное время», которое может быть интерпретировано такие вещи, как: пользовательские предпочтения, дата штамп времени на клиентском компьютере и т.д.

, не зная больше, это трудно сказать, что такое резолюция.

1

SQL 2008 допускает тип данных Date, который не имеет никакого связанного с ним значения времени. Это позволяет кому-то сказать, что мне нужно это сделать с помощью этой Даты, но мне все равно, если это +/- несколько часов. Если выбранная дата - 1/1/2009, но это происходит в 1/2/2009 в 2 утра по времени, им, вероятно, все равно.

Когда пользователю требуется что-то сделанное определенной датой и временем, например, закрытие бизнеса с 01.01.2009, вам необходимо сохранить его в формате DateTime в формате UTC и преобразовать его в локальное время на стороне клиента.

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

2

Если вы не храните минуты и секунды, вы должны предположить, что введенная дата является нужной датой, а не корректировками для GMT. Просто поместите его в базу данных как есть. Люди на западном побережье должны будут предположить, что установленный срок тот же, независимо от того, где вы находитесь в мире. Если вы хотите настроить часовые пояса, вам нужно будет собрать дополнительную информацию, например, час, минуты и секунды.

0

Ваше решение зависит от вашего приложения и требований.

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

Скорее всего, если задание или собрание должно состояться в 21:00 21 марта в Лондоне, то это произойдет в 21:30 21 марта в Аделаиде (+0930), но это требование приложения, а не какой-либо зловещий стандарт, связанный с часовым поясом ,

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

0

Возможно, вы захотите сохранить дату в a, которая известна в часовом поясе. Это поможет вам в ваших расчетах. Например, SQL Server 2008 поддерживает datetimeoffset that does precisely this. Альтернативно, если вы используете SQL 2005 с небольшими усилиями, вы можете написать свой собственный тип данных SQL CLR для поддержки этого.

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