2010-09-09 175 views
2

我有一个日期时间作为一个字符串,例如。 “2010-08-02”,我试图把它与下面的代码段解析日期时间

DateTime.ParseExact("2010-08-02Z", "yyyy-MM-ddZ", CultureInfo.InvariantCulture) 

当我打印到控制台,我得到以下转换为UTC:8/1/2010 5:00: 00 PM。 日期显示为我试图解析日期之前的日期是否有原因?我可以在这一天添加一天来推进到原来的一天,但我想看看是否有任何我在做这个造成的格式错误。

回答

0

如果原始字符串就是其格式为“2010-08-02”(不带Z)的日期,那么为什么不干脆:

DateTime.SpecifyKind(
    DateTime.ParseExact("2010-08-02", 
     "yyyy-MM-dd", 
     CultureInfo.InvariantCulture), 
     DateTimeKind.Utc); 

ParseExact大概会返回一个DateTime与类=不明,并且您可以使用SpecifyKind将其设置为UTC或Local。

3

编辑:我的是正确的混合物,而不是:)

它是显示您的UTC字符串表示的本地时间。令人烦恼的是,DateTime并没有明确这样的事情,IMO。另外,我不认为你想用'Z'作为时区的格式说明符;这实际上并不是有效的格式说明符;它应该是'z',但是这意味着像“+01:00”这样的东西。我认为你应该使用'K'。坦率地说,目前尚不清楚,但如果使用'K',它会正确地往返,(当然,'Z'往返,但仅仅是因为它忽略了它,将其视为纯文本)。

您可以通过只调用ToUniversalTime,或(首选IMO)规定DateTimeStyles.AdjustToUniversal作为一个额外的参数修正:

DateTime dt = DateTime.ParseExact("2010-08-02Z", "yyyy-MM-ddK", 
            CultureInfo.InvariantCulture, 
            DateTimeStyles.AdjustToUniversal); 
+0

Z表示祖鲁时间(格林威治标准时间0),这意味着如果您的时区低于祖鲁时间,那么差值的小时数会从该日期减少,并将我们带回到前一天的特定时间...乐趣!例如,星期五在东京,星期五晚上还是在洛杉矶的星期四晚上,所以它可能是在德里的早上很早的时候,当时它仍然是在伦敦附近的卡蒂萨克的周四;)。 – 2010-09-09 16:46:41

1

午夜为2010-08-02 UTC恰好是下午5点在2010- 08-01。