В C # преобразуйте значение даты и времени Sql Server 2005 в другой часовой пояс - PullRequest
2 голосов
/ 17 февраля 2010

UPDATE

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

КОНЕЦ ОБНОВЛЕНИЯ

Допустим, у меня есть база данных SQL Server 2005 со следующей таблицей:

[id] (int) not null   
[create_date] (datetime) not null

Предположим, что моя [create_date] была сохранена в соответствии с соглашением как часовой пояс TZ-A.

Предположим, я хочу получить это значение (используя SqlClient) из базы данных и отобразить его в другом часовом поясе, TZ-B.

Как мне это сделать?

DateTime from_db = // retrieve datetime from database, in timezone TZ-A
DateTime to_display = //convert from_db to another timezone, TZ-B

Ответы [ 6 ]

2 голосов
/ 17 февраля 2010

Я не собираюсь предлагать ответ, а скорее совет: Всегда храните абсолютные даты в UTC, несмотря ни на что.

2 голосов
/ 17 февраля 2010

У всех есть C # способы, я даю вам TSQL (к сожалению, только 2008):

Смотрите документацию ниже, вы, вероятно, хотите что-то вроде:

-- up here set the @time_zone variable.

 SELECT 
    COl0, TODATETIMEOFFSET(COLDATE, @time_zone),.... ColN, from 
Table_Original;

С MSDN

Функция SWITCHOFFSET регулирует введите значение DATETIMEOFFSET в указанный часовой пояс, сохраняя значение UTC. Синтаксис SWITCHOFFSET (datetimeoffset_value, часовой пояс). Например, следующее код корректирует текущую систему значение datetimeoffset для часового пояса GMT +05: 00:

ВЫБРАТЬ SWITCHOFFSET (SYSDATETIMEOFFSET (), '-05: 00');

Так что, если текущая система значение datetimeoffset - 12 февраля, 2009 10: 00: 00.0000000 -08: 00, это код возвращает значение 12 февраля, 2009 13: 00: 00.0000000 -05: 00.

Функция TODATETIMEOFFSET устанавливает смещение часового пояса входной даты и значение времени Его синтаксис TODATETIMEOFFSET (date_and_time_value, TIME_ZONE).

Эта функция отличается от SWITCHOFFSET несколькими способами. Первый, это не ограничено значение datetimeoffset в качестве ввода; скорее он принимает любые данные даты и времени тип. Во-вторых, он не пытается настроить время на основе часового пояса разница между исходным значением и указанный часовой пояс, но вместо этого просто возвращает введенную дату и значение времени с указанным временем зона в качестве значения datetimeoffset.

Основное назначение Функция TODATETIMEOFFSET предназначена для конвертировать типы, которые не являются часовым поясом в курсе DATETIMEOFFSET по данным смещение часового пояса. Если данная дата и значение времени является DATETIMEOFFSET, изменяется функция TODATETIMEOFFSET значение DATETIMEOFFSET, основанное на та же оригинальная местная дата и время значение плюс новый данный часовой пояс смещение.

Например, текущая система значение datetimeoffset - 12 февраля, 2009 10: 00: 00.0000000 -08: 00, и вы запустите следующий код:

ВЫБРАТЬ TODATETIMEOFFSET (SYSDATETIMEOFFSET (), '-05: 00');

Значение 12 февраля 2009 г. 10: 00: 00.0000000 -05: 00 возвращается. Помните, что SWITCHOFFSET функция возвращена 12 февраля 2009 13: 00: 00.0000000 -05: 00 потому что скорректировал время на основе времени Зональные различия между входом (-08: 00) и указанный часовой пояс (-05: 00)

.

Как упоминалось ранее, вы можете использовать Функция TODATETIMEOFFSET с любым тип данных даты и времени в качестве входных данных. За Например, следующий код принимает текущая системная дата и время и возвращает его как значение datetimeoffset с часовым поясом -00: 05:

ВЫБРАТЬ TODATETIMEOFFSET (SYSDATETIME (), '-05: 00');

2 голосов
/ 17 февраля 2010

Использование TimeZoneInfo

TimeZoneInfo timeZone1 = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
TimeZoneInfo timeZone2 = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime to_display= TimeZoneInfo.ConvertTime(from_db, timeZone1, timeZone2);

Я также согласен, что хранение в UTC - это путь. Единственным недостатком является попытка объяснить UTC пользователям, которые хотят писать свои собственные отчеты.

1 голос
/ 17 февраля 2010

Всегда храните данные в базе данных как UTC. Затем преобразуйте его в клиенте для отображения с UTC по местному времени, используя DateTime.ToLocalTime ();

1 голос
/ 17 февраля 2010

используйте класс TimeZoneInfo, он предоставляет встроенные функции преобразования часовых поясов с помощью Windows API.

http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx

0 голосов
/ 17 февраля 2010

Проверьте метод TimeZoneInfo.ConvertTime .

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