0

我在 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

我想要的是基于PubDateUTCPubDateUTCOffset获得 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 数据库中的数据。

4

4 回答 4

1

我认为您需要使用 DateTimeOffset 类。该线程可能会有所帮助。

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

于 2013-09-10T08:03:04.220 回答
1

您可以尝试以下方法:

var date = post.PubDateUTC.Add(
                TimeSpan.Parse(post.PubDateUTCOffset.Replace("+", ""))
           );

.Replace("+", "")是因为TimeSpan会处理-01:00:00但会窒息+01:00:00

于 2013-09-10T08:07:20.593 回答
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 - 格林威治标准时间 = 02:02:50

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

于 2013-09-10T08:32:24.677 回答
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);

然后,当您需要使用它时,您可以使用 full 的所有选项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
于 2013-09-10T12:58:40.733 回答