2008-09-23 8 views
8

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

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

ответ

4

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

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

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

0

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

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

0

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

Информация о System.TimeZoneInfo here

0

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

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

Удачи!

2

Если вы используете .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 «s в БД в формате 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

Это должно быть принято как ответ – 2012-05-05 18:11:30

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