2012-07-12 73 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

相关问题