Корректировки часового пояса даты и времени

Попробуйте это, (я еще не подтвердил)

INSERT INTO Delegates ([MemNo],[FromYr],[ToYr]) values(@MemNo, @FromYr,@ToYr)
where @MemNo not in 
(
    SELECT MemNo FROM words WHERE FromYr = @FromYr
)
8
задан Mike Kale 14 October 2011 в 07:40
поделиться

5 ответов

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

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

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

4
ответ дан 5 December 2019 в 22:21
поделиться

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

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

0
ответ дан 5 December 2019 в 22:21
поделиться

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

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

0
ответ дан 5 December 2019 в 22:21
поделиться

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

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

Удачи!

0
ответ дан 5 December 2019 в 22:21
поделиться

Если вы используете .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/

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

2
ответ дан 5 December 2019 в 22:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: