我在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 < / p>
我已经尝试过使用TimeZoneInfo类,但我不知道如何使用类似“+8:00:00”的字符串创建一个TimeZoneInfo实例,这将是下面的CreateTimeZoneInfo方法
var tz = CreateTimeZoneInfo(post.PubDateUTCOffset);
return TimeZoneInfo.ConvertTimeFromUtc(post.PubDateUTC, tz);
有没有这样做?
注意:我无法更改SQL数据库中的数据。
答案 0 :(得分:1)
我认为你需要使用DateTimeOffset类。这个帖子可能会有所帮助。
答案 1 :(得分:1)
您可以尝试以下方式:
var date = post.PubDateUTC.Add(
TimeSpan.Parse(post.PubDateUTCOffset.Replace("+", ""))
);
.Replace("+", "")
是因为TimeSpan
会处理-01:00:00
,但会阻塞+01:00:00
答案 2 :(得分:0)
这样做,从偏移中删除任何前导“+”(“ - ”都可以)
var d = new DateTimeOffset(DateTime.Parse("2011-08-04 10:02:50.000"),
TimeSpan.Parse("08:00:00"));
我不确定你想要18:02:50,因为它是格林尼治标准时间+16(+16:00:00)的时间,除非当然这是它在数据库中编码的方式,然后忽略这篇文章:)
答案 3 :(得分:0)
您应该将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