为什么这两个DateTime实例不同?

时间:2017-06-20 14:30:58

标签: c# .net datetime

考虑以下(简化)代码:

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?

5 个答案:

答案 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;

enter image description here

时间分辨率比毫秒更精细。 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));