2017-06-20 41 views
1

考虑以下(简化的)代码:这两个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?

+4

当你说“应该是”,你的意思是你把一个断点,并证实情况实际上是相同的? –

+0

调试器是你的朋友。 –

回答

0

全部回答正确的报道,问题是是10.000倍,比毫秒小蜱,但没有给我一个答案如何更改条件所以它的评估为真。我需要使用构造

DateTime(int year, int month, ...); 

代替:

DateTime(long ticks); 

,因为我的应用程序逻辑。事实证明,使用第一个构造函数不可能设置第10.000th毫秒的部分,并且使用第二个构造函数不可能在没有手动计算某些算术的情况下设置月份中的某一天。我的解决方案是使用第一个构造函数和之前相比增加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)); 
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, ...) 
在这种情况下,只要你想,你可以对它们进行比较

+0

我需要设置不同于原始日期的月份。逻辑工作,除非今天的一天是今天。我如何设置月份的日期并保留DateTime的其余部分? – Uros

+0

@Uros即使当天*不是*今天,您的代码也无法正常工作。在所有这些其他情况下,你失去了几毫秒的时间,你只是没有注意到。 – Servy

+0

@Uros是你想要的吗? –

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

此属性的值表示在0001年1月1,0001年1月1,(UTC 0:00:00 12:00:00以来午夜以来经过的100纳秒为间隔的数量,在公历),代表DateTime.MinValue。

而且还有为它的构造函数:

var reallyNow = new Datetime(now.Ticks); 

你从来没有通过任何价值Ticks成构造为now2(因为它有没有参数),所以now2.Ticks将在四个零结束。但是,直接复制到nowDateTime.Now确实有一个Ticks值,该值不能被10,000整除。

+4

我认为你的答案开始时的链接是某种热闹的模因。多么令人失望。 –

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 
+0

谢谢你。现在我可以更改month of month2吗? – Uros

+1

@Uros:当然,只需使用AddDays和一些数学运算。 – Heinzi

0

的DateTime具有比毫秒较低的分辨率:蜱。当您创建now2时,now2中的最低有效数字.Ticks为零,这就是now2比现在更小的原因。

对我来说: now.Ticks = 636335767998991455 now2。蜱= 636335767998990000

如果要立即复制到now2使用DateTime now2 = new DateTime(now.Ticks)

+0

我想复制除月中某天以外的所有内容。从另一个变量读取月中的某天。我可以设置它吗? – Uros

相关问题