簡體   English   中英

在C#中,將Sql Server 2005 datetime值轉換為另一個時區

[英]In C#, convert Sql Server 2005 datetime value to another timezone

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

使用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。

每個人都有C#方式,我給你TSQL(遺憾的是只有2008年):

請參閱下面的doc,您可能需要以下內容:

-- up here set the @time_zone variable.

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

來自MSDN

SWITCHOFFSET函數將輸入DATETIMEOFFSET值調整為指定的時區,同時保留UTC值。 語法是SWITCHOFFSET(datetimeoffset_value,time_zone)。 例如,以下代碼將當前系統datetimeoffset值調整為時區GMT +05:00:

SELECT SWITCHOFFSET(SYSDATETIMEOFFSET(),' - 05:00');

因此,如果當前系統datetimeoffset值是2009年2月12日10:00:00.0000000 -08:00,則此代碼返回值2009年2月12日13:00:00.0000000 -05:00。

TODATETIMEOFFSET函數設置輸入日期和時間值的時區偏移量。 其語法為TODATETIMEOFFSET(date_and_time_value,time_zone)。

此功能在幾個方面與SWITCHOFFSET不同。 首先,它不限於datetimeoffset值作為輸入; 而是它接受任何日期和時間數據類型。 其次,它不會嘗試根據源值和指定時區之間的時區差異來調整時間,而只是返回帶有指定時區的輸入日期和時間值作為datetimeoffset值。

TODATETIMEOFFSET函數的主要目的是通過給定的時區偏移將不是時區感知的類型轉換為DATETIMEOFFSET。 如果給定的日期和時間值是DATETIMEOFFSET,則TODATETIMEOFFSET函數會根據相同的原始本地日期和時間值加上新的給定時區偏移量更改DATETIMEOFFSET值。

例如,當前系統datetimeoffset值是2009年2月12日10:00:00.0000000 -08:00,並運行以下代碼:

SELECT TODATETIMEOFFSET(SYSDATETIMEOFFSET(),' - 05:00');

返回值2009年2月12日10:00:00.0000000 -05:00。 請記住,SWITCHOFFSET函數在2009年2月12日13:00:00.0000000 -05:00返回,因為它根據輸入(-08:00)和指定時區(-05:00)之間的時區差異調整時間。

如前所述,您可以將TODATETIMEOFFSET函數與任何日期和時間數據類型一起用作輸入。 例如,以下代碼獲取當前系統日期和時間值,並將其作為datetimeoffset值返回,時區為-00:05:

SELECT TODATETIMEOFFSET(SYSDATETIME(),' - 05:00');

我不打算給出答案,而是建議:無論如何, 始終以UTC 格式存儲絕對日期。

使用TimeZoneInfo類,它使用Windows API為您提供內置的時區轉換功能。

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

始終將數據作為UTC存儲在數據庫中。 然后使用DateTime.ToLocalTime()在客戶端中將其轉換為從UTC到本地時間的顯示目的;

檢查方法TimeZoneInfo.ConvertTime

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM