К сожалению, нет быстрого решения этой проблемы. Интернационализация приложения должна быть частью самых первых обсуждений дизайна, поскольку она действительно затрагивает множество различных областей, включая сравнение даты / времени и выходное форматирование.
В любом случае, чтобы начать делать все правильно, важно хранить информацию о часовом поясе со временем . Другими словами, осознание того, что дата / время не 20130407 14:50
имеют смысла без (а) включения текущего смещения UTC для часового пояса (примечание 1) или (b) обеспечения того, что вся логика, вставляющая эти значения, сначала преобразуется в определенное фиксированное смещение ( скорее всего 0). Без этих двух данных значения времени несопоставимы , а данные повреждены . ( Кстати, последний метод - игра с огнем (примечание 2) ; не делайте этого.)
В SQL Server 2008+ вы можете сохранять смещение со временем напрямую, используя datetimeoffset
тип данных. (Для полноты, в 2005 году и ранее, я бы добавил второй столбец для хранения текущего значения смещения UTC (в минутах).)
Это облегчает работу приложений настольного типа, поскольку на этих платформах обычно есть механизмы для автоматического преобразования даты / времени + часового пояса в местное время и последующего форматирования для вывода, все на основе региональных настроек пользователя.
Для сети, которая по своей природе является автономной архитектурой, даже с правильно настроенными внутренними данными, она более сложна, потому что вам нужна информация о клиенте, чтобы иметь возможность выполнять преобразование и / или форматирование. Обычно это делается с помощью настроек пользовательских настроек (приложение конвертирует / форматирует вещи перед выводом) или просто показывает вещи с одинаковым фиксированным форматом и смещением часового пояса для всех (что в настоящее время делает платформа Stack Exchange).
Вы можете видеть, как, если внутренние данные не настроены должным образом, очень быстро они станут сложными и хакерскими. Я не рекомендовал бы идти по любому из этих путей, потому что у вас просто будет больше проблем в будущем.
Примечание 1:
Смещение UTC часового пояса не является фиксированным: рассмотрите переход на летнее время, когда смещение UTC зоны изменяется на плюс или минус час. Кроме того, даты перехода на летнее время в зонах регулярно меняются. Таким образом, использование datetimeoffset
(или совокупность local time
и UTC offset at that time
) приводит к максимальному восстановлению информации.
Заметка 2:
Речь идет об управлении вводом данных. Хотя нет надежного способа проверки входящих значений, лучше применять простой стандарт, который не требует вычислений. Если общедоступный API ожидает тип данных, который включает смещение, это требование будет ясно для вызывающей стороны.
Если это не так, вызывающая сторона должна полагаться на документацию (если они ее читают), или вычисления выполняются неправильно и т. Д. При смещении требуется меньше режимов сбоя / ошибки, в частности для распределенной системы ( или даже просто веб / база данных на отдельных серверах, как здесь).
Хранение смещения в любом случае убивает двух зайцев одним выстрелом; и даже если это не требуется сейчас , это делает возможность доступной позже при необходимости. Правда, это требует больше памяти, но я думаю, что это стоит компромисса, потому что данные будут потеряны, если они никогда не будут записаны в первую очередь.