Date.TryParse结果不正确

时间:2015-08-07 18:27:36

标签: .net vb.net

使用Date.TryParse时,为什么会输入" 2015-03-02-01"在从string转换为Date期间成功,结果为" 3/1/2015 8:00:00 PM"?使用面向.NET 4.0的VS2013。

在这种情况下,我希望Date.TryParse返回false。

如果确实成功了,我希望它能以

返回
  1. " 3 / 2 / 2015"无视决赛" -01"
  2. " 3/1/2015 11 :00:00 PM" 如果它对待决赛" -01"从" 2015-03-02"
  3. 减去一小时
  4. " 3/1/2015 7 :00:00 PM"如果它对待决赛" -01"减去一个 小时,然后应用当前美国东部夏令时UTC 偏移量为-4。
  5. 了解内部发生的事情会导致其返回" 3/1/2015 8 :00:00 PM"?

    这是一个测试用例:

    <TestMethod()>
    Public Sub TestDateTryParse()
        Dim s As String = "2015-03-02-01"
        Dim d As Date
        If Date.TryParse(s, d) Then
            Assert.Fail("Date parsed when should have failed. Input: ""{0}"", Output: ""{1}""", s, d)
        End If
    End Sub
    

    测试结果消息:Assert.Fail失败。应该失败时解析的日期。输入:&#34; 2015-03-02-01&#34;,输出:&#34; 3/1/2015 8:00:00 PM&#34;

2 个答案:

答案 0 :(得分:3)

&#34; -01&#34;在字符串末尾被解释为与UTC的时区偏移(通常称为GMT)。

答案 1 :(得分:3)

该字符串在时区2015-03-02被解释为-01

DateTime.TryParse的文档可以这样说:

  

如果s不包含时区信息,则结果包含DateTime值,该方法返回时Kind属性为DateTimeKind.Unspecified。如果要解析的字符串包含时区信息,则结果包含DateTime值,该方法返回时Kind属性为DateTimeKind.Local

因此,对于像2015-03-02这样非常正常的日期字符串,当您使用DateTime.TryParse()对其进行解析时,您会看到日期的Kind属性为DateTimeKind.Unspecified

但是如果你在有趣的情况下检查Kind属性,你会发现它会给你DateTimeKind.Local,表明解析操作检测到了时区信息。

因此,在这种情况下, 您的 本地时区必须为-05。 (编辑:或更确切地说,-05上的 2015-03-02。由于夏令时,您当前的时区可能会有所不同,但重要的时区是2015-03-02上生效的时区。所以当它解析2015-03-02-01时,它就是这样做的:

  • 在时区2015-03-02-01
  • 2015-03-02 12:00:00 AM解释为-01
  • 将时区2015-03-02 12:00:00 AM的{​​{1}}转换为当地时区-01-05