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

本文关键字:时间 定时区 获取 取日期 UTC 日期 何使用 | 更新日期: 2023-09-27 18:30:42

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

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

你可以尝试这样的事情:

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; }

然后,当您从数据库中读取时(假设数据库中有 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