解析日期时间

时间:2010-09-09 16:33:16

标签: vb.net datetime utc

我有一个日期时间作为字符串,例如。 “2010-08-02”,我正在尝试使用以下代码片段将其转换为UTC

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

当我打印到控制台时,我得到以下内容:2010年8月1日下午5:00:00。 是否有理由将日期显示为我尝试解析的日期之前的日期?我可以添加一天来推进到原来的那一天,但我想看看是否有任何我在格式化中导致错误的事情。

3 个答案:

答案 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。