【问题标题】:Parse date with time zone, skip timezone使用时区解析日期,跳过时区
【发布时间】:2014-12-17 09:06:46
【问题描述】:

我尝试从包含时区信息的字符串中解析日期。输入字符串为2014-12-17T08:05:39+00:00。

我使用DateTime.Parse() 方法返回给我2014-12-17 09:05:39(增加了一小时)。我住在UTC+1:00 (Warsaw),所以.NET 采用这个日期为我的当地时间。

我的问题是如何在跳过时区时使用解析方法,例如2014-12-17T08:05:39+00:00我想得到2014-12-17 08:05:39。

【问题讨论】:

  • 如果你想避免你的时区处理代码中难以发现的错误,我建议你看看 NodaTime。

标签: c# .net datetime


【解决方案1】:

我建议将其解析为 DateTimeOffset 而不是 DateTime。然后,您可以从中获取DateTime,但它将“解析您获得的数据”步骤与“仅使用我想要的位”步骤分开。

使用DateTimeStyles 可能有一些方法可以使DateTime.Parse 的行为符合您的要求——我很惊讶它会自动转换为“本地”类型——但使用DateTimeOffset 会更清楚。

(当然,我真的建议使用Noda Time 代替,解析为OffsetDateTime,然后从中获取LocalDateTime,但这是另一回事...)

【讨论】:

    【解决方案2】:

    如果您删除输入字符串中指定时区的部分,则它会直接解析而不调整到本地时间。那么date.Kind 就是Unspecified。

    var input = "2014-12-17T08:05:39";
    var date = DateTime.Parse(fixedInput);
    

    虽然这可行,但您可能还想看看 NodaTime。

    【讨论】:

      【解决方案3】:

      您应该尝试使用DateTimeOffset 而不是DateTime

      DateTimeOffset result = DateTimeOffset.Parse("2014-12-17T08:05:39+00:00", CultureInfo.InvariantCulture);
      

      它给你:12/17/2014 8:05:39 AM +00:00

      【讨论】:

        猜你喜欢
        • 2020-07-15
        • 1970-01-01
        • 1970-01-01
        • 2013-05-23
        • 2015-09-24
        • 2011-06-05
        • 1970-01-01
        • 2018-01-01
        • 1970-01-01
        相关资源
        最近更新 更多