如何使用UTC日期时间和特定时区获取DateTime?

时间:2013-09-10 07:58:12

标签: c# datetime timezone utc datetimeoffset

我在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数据库中的数据。

4 个答案:

答案 0 :(得分:1)

我认为你需要使用DateTimeOffset类。这个帖子可能会有所帮助。

http://msdn.microsoft.com/en-us/library/bb546101.aspx

答案 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"));
  • d.DateTime - db = 10:02:50的时间
  • d.LocalDateTime - 根据您的服务器时区的时间
  • d.UtcDateTime - GMT时间= 02:02:50

我不确定你想要18:02:50,因为它是格林尼治标准时间+16(+16:00:00)的时间,除非当然这是它在数据库中编码的方式,然后忽略这篇文章:)

答案 3 :(得分:0)

您应该将post课程改为拥有一个属性:

public DateTimeOffset Published { get; set; }

然后当您从数据库中读取时(假设您的数据库中有datetimevarchar类型):

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