【问题标题】:Parse a UTC date string to date in C#在 C# 中将 UTC 日期字符串解析为日期
【发布时间】:2014-07-12 17:35:23
【问题描述】:

简单的问题,我有这个字符串:

string dateString = "7/12/2014 4:42:00 PM";

这是一个日期字符串,它位于 UTC 时区。

我需要将其转换为日期,所以我正在执行以下操作:

DateTimeOffset dateOffset;

DateTimeOffset.TryParse(dateString, out dateOffset);

DateTime date = dateOffset.UtcDateTime;

问题:

当我将字符串解析为日期时,代码认为 dateString 位于 PC 的本地时区(+3 GMT),而不是 UTC 时区。

所以我得到以下dateOffset = {7/12/2014 4:42:00 PM +03:00}date = {7/12/2014 1:42:00 PM}

我如何告诉他提供的日期字符串是 UTC 格式而不是本地时区格式?

谢谢

【问题讨论】:

    标签: c# string parsing datetime


    【解决方案1】:

    我如何告诉他提供的日期字符串是 UTC 格式而不是本地时区格式?

    在调用中指定DateTimeStylesAssumeUniversal。这告诉解析代码该做什么。例如:

    // null here means the thread's current culture - adjust it accordingly.
    if (DateTimeOffset.TryParse(dateString, null, DateTimeStyles.AssumeUniversal,
                                out dateOffset))
    {
        // Valid
    }
    

    您应该始终使用TryParse 的结果来判断它是否被成功解析。

    如果您知道格式和特定​​文化,我个人会使用DateTimeOffset.TryParseExact。 (好吧,老实说,我会使用我的 Noda Time 项目开始,但那是另一回事。)

    【讨论】:

    • 哇,伟大的 Jon Skeet 回答了我的问题。这是一个桶列表条目完成!是时候关注我的下一个条目了:“绕月飞行”。谢谢:D
    【解决方案2】:

    DateTimeOffset.TryParse 的另一个重载

    DateTimeOffset.TryParse Method (String, IFormatProvider, DateTimeStyles, DateTimeOffset)
    

    允许您指定DateTimeStylesDateTimeStyles 之一是 AssumeUniversal,这就是您要查找的内容:

    如果解析的字符串中没有指定时区,则字符串为 假定表示 UTC。该值不能与 AssumeLocal 或 RoundtripKind。

    【讨论】:

      【解决方案3】:

      不知道 .Net API 是如何提供的,但我想您可能会在解析之前使用 ISO8601 格式来指示 UTC 时区,即首先将 7/12/2014 4:42:00 PM 转换为 2014-07-02T16:42:00Z,然后使用 try parse using日期时间偏移

      【讨论】:

        猜你喜欢
        • 2021-04-19
        • 1970-01-01
        • 1970-01-01
        • 2012-06-14
        • 2014-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-21
        相关资源
        最近更新 更多