【问题标题】:How to get DateTime with a UTC datetime and a particular timezone?如何使用 UTC 日期时间和特定时区获取 DateTime?
【发布时间】:2013-09-10 07:58:12
【问题描述】:

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

【问题讨论】:

  • 将日期保存为数据库中的 DateTimeOffset 这非常有帮助,我为你写一个例子!或者你现在不能这样做
  • 我不允许修改数据库设计:(
  • 您的目标是获取当地时间吗?还是偏移量指定的时区的本地时间?还是其他时区?
  • 应该“2011-08-04 10:02:50.000, +8:00:00”实际上导致“2011-08-04 2:02:50:000”吗?这是格林威治标准时间的等效时间。
  • 和Leonid有同样的想法,你确定你要求的结果是对的吗?

标签: c# datetime timezone utc datetimeoffset


【解决方案1】:

你可以试试这样的:

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

.Replace("+", "") 是因为 TimeSpan 将处理 -01:00:00 但会阻塞 +01:00:00

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这可行,从偏移量中删除任何前导“+”(“-”可以)

      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) 的时间,除非当然这是它在数据库中的编码方式,然后忽略这篇文章:)

      【讨论】:

        【解决方案4】:

        您应该将您的 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多