我有一个日期时间作为字符串,例如。 “2010-08-02”,我正在尝试使用以下代码片段将其转换为UTC
DateTime.ParseExact("2010-08-02Z", "yyyy-MM-ddZ", CultureInfo.InvariantCulture)
当我打印到控制台时,我得到以下内容:2010年8月1日下午5:00:00。 是否有理由将日期显示为我尝试解析的日期之前的日期?我可以添加一天来推进到原来的那一天,但我想看看是否有任何我在格式化中导致错误的事情。
答案 0 :(得分:3)
编辑:我有正确与否的混合:)
它显示 UTC 字符串表示的本地时间。 IMO,令人讨厌的是,DateTime并没有让这种事情变得清晰。另外,我认为你不想使用'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);
答案 1 :(得分:1)
2010-08-02午夜的UTC发生在2010-08-01的下午5点。
答案 2 :(得分:0)
如果原始字符串只是“2010-08-02”格式的日期(没有Z),那么为什么不只是:
DateTime.SpecifyKind(
DateTime.ParseExact("2010-08-02",
"yyyy-MM-dd",
CultureInfo.InvariantCulture),
DateTimeKind.Utc);
ParseExact可能会返回Kind = Unspecified的DateTime,您可以使用SpecifyKind将其设为UTC或Local。