使用DateTime.ParseExact只获取时间(没有一天)

时间:2011-09-30 21:24:30

标签: .net vb.net

当我使用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:

  • 它在调试器中显示为#12:00:01 AM#(没有白天)
  • TooBig1为假
  • Equal1为True

但结果是(错误的?)dt2意外:

  • 它在调试器中显示为#9/30/2011 12:00:01 AM#
  • TooBig2为True
  • Equal2为假

看起来是因为ParseExact系统地添加了这一天,即使我只是在格式中指定时间。

我的问题是:如何用DateTime.ParseExact读取时间?

3 个答案:

答案 0 :(得分:4)

Documentation州:

  

如果format定义了没有日期元素的时间并且解析操作成功,则生成的DateTime值的日期为DateTime.Now.Date

如果您想要没有日期的时间,可以使用:

var parsedDate = DateTime.ParseExact(...);
var timeOnly = parsedDate - parsedDate.Date;

答案 1 :(得分:2)

使用dt1.TimeOfDaydt2.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)