2012-10-02 70 views
1

我想將我的時間轉換爲通用時間,當我在數據庫中存儲日期時間並從數據庫中檢索時轉換回系統時間。日期時間轉換從UTC到本地兩次

他們兩個我已經通過創建功能ConvertToLocalTime()ConvertToUniversalTime()完全做到了成功。

用於轉換爲本地時間的代碼下面給出:

public void ConvertToLocalTime() 
    { 
     string szTimezoneinfoid = TimeZoneInfo.Local.Id.ToString(); 
     TimeZoneInfo tzInfo = TimeZoneInfo.FindSystemTimeZoneById(szTimezoneinfoid); 

     this.m_dtCreatedDate = TimeZoneInfo.ConvertTimeFromUtc(m_dtCreatedDate, tzInfo); 
    } 

當我調用一個函數Shipment.ConvertToLocalTime()它改變直到這裝運創建日期爲當地時間它工作正常。

現在,如果我再次調用Shipment.ConvertToLocalTime(),那麼它會再次將本地時間視爲UTC並將其轉換爲本地時間。

如果已經在當地時間,有什麼辦法阻止轉換爲本地時間?

有沒有什麼辦法可以得到日期時間的時區?

+0

我想你可以用'TimeZoneInfo txInfo = TimeZoneInfo.Local'替換你的前兩行。 – Rawling

回答

1

我不確定您的示例中究竟出了什麼問題,但如果您只想從數據庫獲取UTC的日期/時間並將其轉換爲當地時間,則可以執行以下操作:

var dbTime = //whatever, from database. 
var utcTime = DateTime.SpecifyKind(dbTime, DateTimeKind.Utc); 
var localTime = utcTime.ToLocalTime(); 

在我自己的項目中,我首先檢查dbTime.Kind != DateTimeKind.Local,以防萬一我的數據讀取器決定開始爲我執行轉換。

+0

感謝您提供寶貴的信息 –

2

TimeZoneInfo.ConvertTimeFromUtc的結果是DateTimeKindUnspecified,除非時區本身是UTC。

當你傳遞結果爲TimeZoneInfo.ConvertTimeFromUtc,它會假設你懂得是UTC DateTime - 否則,你將不會被調用ConvertTimeFromUtc ...

基本上,DateTime.Kind是一個黑客設法工作圍繞DateTime嘗試表示太多不同事物的問題。你的方法從可能含糊不清的數據開始,並以模糊的數據結束...這不是一個好兆頭。

要麼你可以確保你總是知道你在做什麼,並避免使用自己的結果調用你的方法,或者你可以考慮使用Noda Time,我的替代.NET日期/時間API避免了這種事情通過使用不同的數據類型來表示不同類型的數據。

+0

感謝您的寶貴信息 –

相關問題