Корректировка часового пояса даты и времени - PullRequest
8 голосов
/ 23 сентября 2008

Моя база данных находится, например, в калифорния. Моя таблица пользователя имеет весь часовой пояс пользователя, например, -0700 UTC

Как я могу настроить время с моего сервера базы данных всякий раз, когда я показываю дату пользователю, который живет, например Нью-Йорк? UTC / GMT -4 часа

Ответы [ 5 ]

4 голосов
/ 23 сентября 2008

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

DateTime.ToUniversalTime() -> server;
DateTime.ToLocalTime() -> client

Вы можете настроить дату / время, используя группу методов AddXXX, но она может быть подвержена ошибкам. .NET поддерживает часовые пояса в System.TimeZoneInfo классе.

2 голосов
/ 26 июля 2009

Если вы используете .Net, вы можете использовать TimeZoneInfo. Поскольку вы пометили вопрос с помощью «c #», я предполагаю, что вы делаете.

Первый шаг - получение TimeZoneInfo для часового пояса, в который требуется преобразовать. В вашем примере часовой пояс Нью-Йорка. Вот способ, которым вы можете сделать это:

//This will get EST time zone
TimeZoneInfo clientTimeZone
    = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");

//This will get the local time zone, might be useful
// if your application is a fat client
TimeZoneInfo clientTimeZone = TimeZoneInfo.Local;

Затем, после того, как вы прочитали DateTime из вашей БД, вы должны убедиться, что Kind установлено правильно. Предположим, что DateTime в БД находятся в UTC (кстати, это обычно рекомендуется), вы можете подготовить его для преобразования следующим образом:

DateTime aDateTime = dataBaseSource.ReadADateTime();
DateTime utcDateTime = DateTime.SpecifyKind(aDateTime, DateTimeKind.Utc);

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

DateTime clientTime = TimeZoneInfo.ConvertTime(utcDateTime, clientTimeZone);

Некоторые дополнительные замечания:

  • TimeZoneInfo можно хранить в статических полях, если вас интересуют только несколько конкретных часовых поясов;
  • TimeZoneInfo хранить информацию о переходе на летнее время. Таким образом, вам не придется беспокоиться об этом;
  • Если ваше приложение является веб-сайтом, выяснить, в каком часовом поясе находится ваш клиент, может быть сложно. Один способ объясняется здесь: http://kohari.org/2009/06/15/automagic-time-localization/

Надеюсь, это поможет. :)

0 голосов
/ 23 сентября 2008

Вы знаете, это хороший вопрос. В этом году я сделал свое первое приложение БД, и поскольку мои входные данные, относящиеся ко времени, представляют собой значение Int64, то есть то, что я сохранил в БД. Мои клиентские приложения извлекают его и выполняют DateTime.FromUTC () или FromFileTimeUTC () для этого значения и выполняют .LocalTime (), чтобы показать вещи по местному времени. Я задавался вопросом, было ли это хорошо / плохо / ужасно, но до сих пор это работало достаточно хорошо для моих нужд. Конечно, работа завершается созданной мной библиотекой уровня доступа к данным, а не самой БД.

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

Удачи!

0 голосов
/ 23 сентября 2008

Вы можете использовать комбинацию TimeZoneInfo.GetSystemTimeZones (), а затем использовать свойство TimeZoneInfo.BaseUtcOffset для смещения времени в базе данных на основе разницы смещения

Информация о System.TimeZoneInfo здесь

0 голосов
/ 23 сентября 2008

Вплоть до .NET 3.5 (VS 2008) .NET не имеет встроенной поддержки часовых поясов, кроме преобразования в и из UTC.

Если разница во времени всегда ровно 3 часа в течение всего года (летом и зимой), просто используйте yourDate.AddHours(3), чтобы изменить его в одну сторону, и yourDate.AddHours(-3), чтобы изменить обратно. Обязательно включите это в функцию, объясняющую причину добавления / вычитания этих 3 часов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...