2012-08-26 218 views
0

如果我编写一个简单方法返回历元时间和DateTime.UtcNow之间的毫秒数,我会得到一个正确的答案。但是,如果我编写一个方法来返回任意日期和纪元时间之间的毫秒数,则最后三位数字始终为零。 '一些任意日期'意味着我将DateTime.Parse(“任意日期字符串”)的输出传递给方法。就像我可以做出的那样,由.Parse返回的DateTime对象不会返回所有有效数字。在任意日期和历元时间之间取得毫秒

测试方法:

static void GetMillis() 
     { 
      DateTime dUtc = DateTime.UtcNow; 
      DateTime epoch = new DateTime(1970,1,1,0,0,0,DateTimeKind.Utc); 
      double utcmillis = (dUtc - epoch).TotalMilliseconds; 
      String timestamp = dUtc.ToString(); 
      DateTime arbitrary = (DateTime.Parse(timestamp)); 
      Console.WriteLine("Milliseconds between DateTime.UtcNow {0} \nand epoch time {1} are {2}", dUtc, epoch, utcmillis); 
      Console.WriteLine("Milliseconds between arbitrary date {0} \nand epoch time {1} are {2}", arbitrary, epoch, (arbitrary - epoch).TotalMilliseconds); 
     } 

输出:

C:\src\vs\epochConverter\epochConverter\bin\Debug 
{powem} [54] --> .\epochConverter.exe -debug 
Milliseconds between DateTime.UtcNow 8/26/2012 11:12:31 PM 
and epoch time 1/1/1970 12:00:00 AM are 1346022751385.8 
Milliseconds between arbitrary date 8/26/2012 11:12:31 PM 
and epoch time 1/1/1970 12:00:00 AM are 1346022751000 

我不知道如果我做一些荒唐错误或此处没有理解数学。我在MSDN中进行了研究,找不到任何与此区别有关的内容。我真的希望能够按照描述计算millis - 是否有可能?

谢谢。

熔点

回答

2

要检查的中间值:

String timestamp = dUtc.ToString(); 

究竟有什么回报将取决于您的本地设置,但它会是这样8/26/2012 11:12:31,这是只有精确到秒。

解析这当然给了0毫秒的日期时间。

因此,您的毫秒自时代方法在该点上具有零点是正确的。

然而,如果你不喜欢的东西:

arbitrary = new DateTime(2012, 8, 26, 11, 12, 31, 123); 

你会得到这些123毫秒影响的结果。您也可以使用ToStringParseExact,其中包含一秒钟的小数部分或其他获取DateTime的其他方法。

总而言之,你的毫秒级以来的时间非常完美,但你得到一个测试日期的方法是有缺陷的。

+0

感谢您的详细解答。我想这个挑战是有缺陷的想法。因为我希望两个日期之间的毫秒_difference_和任何给定的日期必须可以表示为毫秒数。但是,我想,那并不是真正发生在DateTime数学上的事情。用例是将演示格式中的日期字符串转换为DateTime对象,然后进行处理。我曾看过MSDN文章“如何:在日期和时间值中显示毫秒数”,但我一直无法为我工作。 – naugiedoggie

+0

如果用例需要你解析一个字符串,那么最后的'000'就可能没问题。这可能只是由于毫秒 - 自1970年以来在某些系统中作为日期的常见内部表示,并且与此有关。 –

+0

考虑到它后,我相信我已经更好地理解计算日期数学时实际发生的情况。我有一个工具,它应该在_epoch时间内产生数值_但有时候会以毫秒和几秒钟的速度被喷出。这显然是一个错误,但对我来说这是一个黑盒子。所有这些问题的结局都是为了计算这些差异而制作最简单的工具。我不喜欢做我不了解他们如何工作的事情。 ;-) – naugiedoggie

1

默认DateTime.ToString()格式不包括毫秒,这是数据丢失,其中;它发生之前Parse。为了获得在字符串表示毫秒,使用自定义格式:

DateTime.UtcNow.ToString() 
// -> 8/26/2012 11:37:24 PM 
DateTime.Parse("8/26/2012 11:37:24 PM").Millisecond 
// -> 0 

DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffffffK") 
// -> 2012-08-26T23:41:17.3085938Z 
DateTime.Parse("2012-08-26T23:41:17.3085938Z").Millisecond 
// -> 308 

The Round-trip ("O", "o") Format Specifier 少打字。或者,在这种情况下,请考虑完全避免转换:-)

数学是合理的。

0

这里的数学看起来很合理。不要忘记1秒钟内有1000毫秒的时间,因此任意时间的计算不包括毫秒与几乎相同的时间(包括毫秒)之间的误差为+/- 1000毫秒。