考虑以下(简化)代码:
DateTime now = DateTime.Now;
DateTime now2 = new DateTime(now.Year, now.Month, now.Day,
now.Hour, now.Minute, now.Second,
now.Millisecond, now.Kind);
bool condition = (now <= now2);
由于我已将now
的字段复制到now2
,因此DateTime
结构的这两个实例应相等。但是,condition
评估为false
。为什么呢?
我是否可以通过某种方式更改代码,以便条件评估为true?
答案 0 :(得分:7)
It's the Ticks。它始终是Ticks。有时。
DateTime now = DateTime.Now;
DateTime now2 = new DateTime(now.Year, now.Month, now.Day,
now.Hour, now.Minute, now.Second, now.Millisecond);
bool condition = (now <= now2);
var diff = now2 - now;
时间分辨率比毫秒更精细。 Ticks
is the real value:
此属性的值表示自公元1月1日午夜12:00:00(公历1月1日0:00:00到公历)以来经过的100纳秒间隔的数量,代表DateTime.MinValue。
还有一个构造函数:
var reallyNow = new Datetime(now.Ticks);
您从未将Ticks
的任何值传递给now2
的构造函数(因为它没有参数),因此now2.Ticks
最后会有四个零。但是,您直接复制到DateTime.Now
的{{1}}确实具有now
值,该值不能被10,000整除。
答案 1 :(得分:1)
你忘记了蜱虫。条件成立:
var now = DateTime.Now;
var now2 = new DateTime(now.Ticks);
var eq = now <= now2;
编辑:回答评论中的问题:
var tempNow = DateTime.Now;
var now = new DateTime(tempNow.Year ...);
var now2 = new DateTime(tempNow.Year, tempNow.Month, customDay, ...)
在这种情况下,您可以根据需要进行比较。
答案 2 :(得分:1)
因为resolution of DateTime是100纳秒,而不是1毫秒。您只能将值复制到毫秒。
时间值以100纳秒为单位测量,称为刻度,[...]
因此,您需要使用允许精度高于1毫秒的构造函数,例如the constructor accepting "ticks":
DateTime now = DateTime.Now;
DateTime now2 = new DateTime(now.Ticks);
bool condition = (now <= now2); // yields true
答案 3 :(得分:0)
DateTime的分辨率低于毫秒:刻度。当你创建now2时,now2.Ticks中的最低有效数字为零,这就是为什么now2比现在更小的原因。
对我来说: now.Ticks = 636335767998991455 now2.Ticks = 636335767998990000
如果您想立即复制到now2,请使用DateTime now2 = new DateTime(now.Ticks)
答案 4 :(得分:0)
所有答案都正确地报告问题是以小于毫秒的10.000倍的刻度,但没有给出答案如何更改条件以使其评估为真。我需要使用构造函数
DateTime(int year, int month, ...);
而不是:
DateTime(long ticks);
因为我的应用逻辑。事实证明,对于第一个构造函数,不可能设置10.000的毫秒数,而对于第二个构造函数,如果不手动计算某些算术,则无法设置日期。我的解决方案是使用第一个构造函数并在比较之前添加1毫秒:
DateTime now = DateTime.Now;
DateTime now2 = new DateTime(now.Year, now.Month, now.Day,
now.Hour, now.Minute, now.Second,
now.Millisecond, now.Kind);
bool condition = (now <= now2.AddMilliseconds(1));