2014-07-12 40 views
2

简单的问题,我有这个字符串:解析一个UTC日期字符串到日期在C#

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

感谢

回答

4

我怎么能告诉他,所提供的日期字符串在UTC格式,而不是在本地时区格式?

在呼叫中指定AssumeUniversal的值DateTimeStyles。这告诉解析代码要做什么。例如:

// 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

哇,伟大的Jon Skeet回答我的问题。这是一个桶列表条目完成!时间集中在我的下一个条目上:“绕月球飞行”。感谢:D – Youssef

2

还有就是DateTimeOffset.TryParse

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

,它允许你指定DateTimeStyles另一个重载。其中DateTimeStyles的是AssumeUniversal,这就是你要找的东西:

如果解析字符串中指定任何时区,该字符串是 假定来表示UTC。此值不能与AssumeLocal或 RoundtripKind一起使用。

1

不知道API的净提供,但我想你大概可以使用ISO8601格式解析之前表示UTC时区,即首先转换7/12/2014 4:42:00 PM弄成2014-07-02T16:42:00Z,然后使用尝试使用的DateTimeOffset

解析