在C#中将UTC日期字符串解析为日期

时间:2014-07-12 17:35:23

标签: c# string parsing datetime

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

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格式而不是本地时区格式?

由于

3 个答案:

答案 0 :(得分:6)

  

我怎么能告诉他提供的日期字符串是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项目开始,但这是另一回事。)

答案 1 :(得分:2)

DateTimeOffset.TryParse

还有另一个重载
DateTimeOffset.TryParse Method (String, IFormatProvider, DateTimeStyles, DateTimeOffset)

允许您指定DateTimeStyles。其中一个DateTimeStylesAssumeUniversal,这是您正在寻找的内容:

  

如果解析后的字符串中未指定时区,则字符串为   假设表示UTC。此值不能与AssumeLocal一起使用   RoundtripKind。

答案 2 :(得分:1)

不知道.Net API是如何提供的,但我猜你可能会在解析之前使用ISO8601格式来表示UTC时区,即首先将7/12/2014 4:42:00 PM翻译成2014-07-02T16:42:00Z然后使用DateTimeOffset

使用try parse