我有一个日期时间作为一个字符串,例如。 “2010-08-02”,我试图把它与下面的代码段解析日期时间
DateTime.ParseExact("2010-08-02Z", "yyyy-MM-ddZ", CultureInfo.InvariantCulture)
当我打印到控制台,我得到以下转换为UTC:8/1/2010 5:00: 00 PM。 日期显示为我试图解析日期之前的日期是否有原因?我可以在这一天添加一天来推进到原来的一天,但我想看看是否有任何我在做这个造成的格式错误。
我有一个日期时间作为一个字符串,例如。 “2010-08-02”,我试图把它与下面的代码段解析日期时间
DateTime.ParseExact("2010-08-02Z", "yyyy-MM-ddZ", CultureInfo.InvariantCulture)
当我打印到控制台,我得到以下转换为UTC:8/1/2010 5:00: 00 PM。 日期显示为我试图解析日期之前的日期是否有原因?我可以在这一天添加一天来推进到原来的一天,但我想看看是否有任何我在做这个造成的格式错误。
如果原始字符串就是其格式为“2010-08-02”(不带Z)的日期,那么为什么不干脆:
DateTime.SpecifyKind(
DateTime.ParseExact("2010-08-02",
"yyyy-MM-dd",
CultureInfo.InvariantCulture),
DateTimeKind.Utc);
ParseExact大概会返回一个DateTime与类=不明,并且您可以使用SpecifyKind将其设置为UTC或Local。
编辑:我的是正确的混合物,而不是:)
它是显示您的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);
午夜为2010-08-02 UTC恰好是下午5点在2010- 08-01。
Z表示祖鲁时间(格林威治标准时间0),这意味着如果您的时区低于祖鲁时间,那么差值的小时数会从该日期减少,并将我们带回到前一天的特定时间...乐趣!例如,星期五在东京,星期五晚上还是在洛杉矶的星期四晚上,所以它可能是在德里的早上很早的时候,当时它仍然是在伦敦附近的卡蒂萨克的周四;)。 – 2010-09-09 16:46:41