1

如果我编写一个简单的方法来返回纪元时间和 之间的毫秒数DateTime.UtcNow,我会得到一个正确的答案。但是,如果我编写一个方法来返回某个任意日期和纪元时间之间的毫秒数,则最后三位数字始终为零。“某个任意日期”意味着我将 DateTime.Parse("arbitrary date string") 的输出传递给该方法。据我所知,.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 中进行了研究,但找不到与此差异相关的任何内容。我真的很希望能够按照描述计算毫秒——这可能吗?

谢谢。

mp

4

3 回答 3

3

您要检查以下中间值:

String timestamp = dUtc.ToString();

它返回的内容将取决于您的本地设置,但它会类似于8/26/2012 11:12:31,仅精确到最接近的秒数。

解析它当然会给出一个 0 毫秒的日期时间。

因此,您的毫秒自纪元方法在该点处为零是正确的。

但是,如果您做了类似的事情:

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

你会得到影响结果的 123 毫秒。您还可以使用包含几分之一秒的 aToString和 a ParseExact,或一系列其他获取 DateTime 的方法。

总而言之,您的毫秒数自纪元运行良好,但您获取测试日期的方式存在缺陷。

于 2012-08-26T23:29:31.080 回答
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

请参阅往返 ("O", "o") 格式说明符 以键入 less。或者,在这种情况下,考虑完全避免转换:-)

数学是正确的。

于 2012-08-26T23:29:04.770 回答
0

这里的数学看起来很合理。不要忘记 1 秒中有 1000 毫秒,因此从不包括毫秒的任意时间与包括毫秒的几乎相同时间的任何日期计算都会有 +/- 1000 毫秒的误差。

于 2012-08-26T23:30:56.860 回答