当我使用DateTime.ParseExact时,我得到了意想不到的结果。 这是我的测试代码:
Dim MinVal As DateTime = #12:00:01 AM#
Dim MaxVal As DateTime = #11:59:59 PM#
Dim TooBig1, Equal1 As Boolean
Dim TooBig2, Equal2 As Boolean
Dim dt1 As DateTime = #12:00:01 AM#
Dim dt2 As DateTime = DateTime.ParseExact("12:00:01 AM", "hh:mm:ss tt", Globalization.DateTimeFormatInfo.InvariantInfo)
TooBig1 = (dt1.CompareTo(MaxVal) > 0)
Equal1 = (dt1.CompareTo(MinVal) = 0)
TooBig2 = (dt2.CompareTo(MaxVal) > 0)
Equal2 = (dt2.CompareTo(MinVal) = 0)
结果适用于dt1:
但结果是(错误的?)dt2意外:
看起来是因为ParseExact系统地添加了这一天,即使我只是在格式中指定时间。
我的问题是:如何用DateTime.ParseExact读取时间?
答案 0 :(得分:4)
如果format定义了没有日期元素的时间并且解析操作成功,则生成的DateTime值的日期为
DateTime.Now.Date
。
如果您想要没有日期的时间,可以使用:
var parsedDate = DateTime.ParseExact(...);
var timeOnly = parsedDate - parsedDate.Date;
答案 1 :(得分:2)
使用dt1.TimeOfDay
和dt2.TimeOfDay
进行此类比较......因此将日期部分排除在等式之外......
答案 2 :(得分:2)
如果你没有指定一天,它显然假设今天。 (如果你正在写时间跟踪软件,那就不无道理了。)
如果你只想要时间部分,你可以像你现在一样解析它,然后只抓住时间部分:
' Existing code:
Dim dt2 As DateTime = DateTime.ParseExact("12:00:01 AM", "hh:mm:ss tt", _
Globalization.DateTimeFormatInfo.InvariantInfo)
' Now grab just the time:
Dim ts2 As TimeSpan = dt2.TimeOfDay
这将是TimeSpan
而不是DateTime
,但如果您实际上需要将其作为DateTime,那么TimeSpan更适合仅仅几小时的事情/分钟/秒但不是几天。
(你可能也尝试首先使用TimeSpan.ParseExact,但它不是为处理AM / PM而构建的,并且会将12:00:01解析为12小时。所以你可能确实想要DateTime.ParseExact然后是.TimeOfDay。)
如果您实际上做需要将其表示为DateTime - 日期部分为1/1/0001 - 您可以随时将TimeSpan转换回DateTime:
Dim dt3 As New DateTime(1, 1, 1, ts2.Hours, ts2.Minutes, ts2.Seconds, ts2.Milliseconds)