我在SQL数据库中的数据如下所示:
PubDateUTC PubDateUTCOffset
----------------------- --------------------
2011-08-04 10:02:50.000 +8:00:00
2012-04-23 02:32:25.287 +8:00:00
2010-09-26 04:23:00.000 +8:00:00
我想要的是获取基于 PubDateUTC 和 PubDateUTCOffset 的 DateTime,例如:
2011-08-04 10:02:50.000, +8:00:00 应导致 2011-08-04 18:02:50:000
我已经尝试过使用TimeZoneInfo类,但我不知道是否使用类似"+8:00:00"之类的字符串创建TimeZoneInfo的实例,这将是下面的CreateTimeZoneInfo方法
var tz = CreateTimeZoneInfo(post.PubDateUTCOffset);
return TimeZoneInfo.ConvertTimeFromUtc(post.PubDateUTC, tz);
有没有办法这样做?
注意:我无法更改SQL数据库中的数据。
你可以尝试这样的事情:
var date = post.PubDateUTC.Add(
TimeSpan.Parse(post.PubDateUTCOffset.Replace("+", ""))
);
.Replace("+", "")
是因为TimeSpan
会处理-01:00:00
但会窒息+01:00:00
我认为你需要使用DateTimeOffset class。此线程可能会有所帮助。
http://msdn.microsoft.com/en-us/library/bb546101.aspx
这有效,从偏移量中删除任何前导"+"("-"都可以)
var d = new DateTimeOffset(DateTime.Parse("2011-08-04 10:02:50.000"),
TimeSpan.Parse("08:00:00"));
- d.日期时间 - 以 db 为单位的时间 = 10:02:50
- d.本地日期时间 - 根据您的服务器时区划分的时间
- d.Utc日期时间 - 格林威治标准时间 = 02:02:50
我不确定你想要 18:02:50,因为它是 GMT+16 (+16:00:00) 的时间,除非这是它在数据库中的编码方式,然后忽略这篇文章:)
您应该将post
类更改为具有一个属性:
public DateTimeOffset Published { get; set; }
然后,当您从数据库中读取时(假设数据库中有 datetime
和 varchar
类型):
DateTime utc = DateTime.SpecifyKind(
(DateTime) reader["PubDateUTC"], DateTimeKind.Utc);
TimeSpan offset = TimeSpan.Parse(
((string) reader["PubDateUTCOffset"]).Replace("+", ""))
post.Published = new DateTimeOffset(utc).ToOffset(offset);
然后,当您需要使用它时,您可以使用完整DateTimeOffset
的所有选项:
DateTime local = post.Published.DateTime; // with your offset applied
DateTime utc = post.Published.UtcDateTime; // the original utc value
string s = post.Published.ToString("o"); // 2011-08-04T18:02:50.0000000+08:00