2012-07-12 82 views
0

這是C#你怎麼存儲的DateTimeOffset在SQL Server DateTime字段

我消耗來自RSS源的數據,並希望將數據存儲在我們的數據庫。我遇到的問題是如何存儲LastUpdateTime。

XmlReader reader = XmlReader.Create(uri); 
SyndicationFeed rssFeed = SyndicationFeed.Load(reader); 

var lastUpdate = rssFeed.LastUpdatedTime; 

問題是rssFeed.LastUpdateTime是一個DateTimeOffset。但是,我們使用的是僅包含DateTime的SQL Server 2005。處理這種情況的最佳做法是什麼?如果重要,我們所有的數據庫和服務器都在東部時間。

謝謝。

回答

2

使用rssFeed.LastUpdateTime.UtcDateTime將DateTimeOffset轉換爲UTC DateTime最簡單,然後將其存儲在數據庫的DateTime字段中。

不要打擾存儲偏移量,沒有必要。無論如何,Offset不會將DateTime值與任何時區關聯。

然後,您可以使用.NET中的內置TimeZoneInfo類將UTC日期時間值轉換爲任何時區。 TimeZoneInfo類的美妙之處在於它還將調整夏令時的日期時間值。

這也是性能和存儲方面的最佳解決方案。

1

我通常有一個附加列,像

[LastUpdateOffset] SMALLINT NOT NULL 

,並用它來儲存給定的行偏移。然後轉換爲客戶端,就像

/// <summary> 
/// Convert a given UTC DateTime value into its localized value from given offset 
/// </summary> 
/// <param name="column">DateTime value, such as CreatedOn, UpdatedOn etc</param> 
/// <param name="offset">-60 is DST for example</param> 
private void ConvertUTCToClientTimeZone(DateTime column, int offset) 
{ 
    TimeSpan offsetTimeSpan = new TimeSpan(0, offset, 0).Negate(); 
    DateTimeOffset newDate = new DateTimeOffset(column, offsetTimeSpan); 
    column = newDate.DateTime; 
} 

希望這會有所幫助! :)

+0

好的,所以要將它存儲在數據庫中,你存儲的是UTC時間,對吧?類似於DateTime dbDateTime = rssFeed.LastUpdateTime.UtcDateTime – John 2012-07-12 19:53:08

+0

在您的示例中,offset參數被定義爲int。 UTC國家內有許多國家和地區不能使用int值進行定義。例如,印度和斯里蘭卡的UTC時間偏移量爲+05:30。這比人們所期望的更普遍。通常,當地時間的UTC抵消決策基於政治。由於政客的奇想,UTC抵消不一定是可預測的。 – 2016-01-06 17:27:30

相關問題