使用Date.TryParse
时,为什么会输入" 2015-03-02-01"在从string
转换为Date
期间成功,结果为" 3/1/2015 8:00:00 PM"?使用面向.NET 4.0的VS2013。
在这种情况下,我希望Date.TryParse
返回false。
如果确实成功了,我希望它能以
返回了解内部发生的事情会导致其返回" 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;
答案 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