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

JBB*_*JBB 7 .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)
Run Code Online (Sandbox Code Playgroud)

对于dt1,结果很好:

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

但结果是(错误?)dt2出乎意料:

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

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

我的问题是:我怎样才能用DateTime.ParseExact读取时间?

Jim*_*hel 4

文件指出:

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

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

var parsedDate = DateTime.ParseExact(...);
var timeOnly = parsedDate - parsedDate.Date;
Run Code Online (Sandbox Code Playgroud)

  • 是的,“无类型”的意思是“没有在代码中明确类型化”,这确实意味着类型推断。这也是一个完美的例子;从代码中根本看不出“DateTime”减去“DateTime”等于“DateTime”。 (4认同)
  • 不过,它变成了“TimeSpan”对象,而不是“DateTime”。您掩盖这一重要细节的事实再次表明,使用非类型化变量是一种糟糕的做法。 (3认同)