【问题标题】:Getting Milliseconds elapsed between arbitrary date and Epoch time在任意日期和纪元时间之间经过毫秒
【发布时间】:2012-08-26 23:24:41
【问题描述】:

如果我编写一个简单的方法来返回纪元时间和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

【问题讨论】:

    标签: c# datetime date-math


    【解决方案1】:

    您要检查以下各项的中间值:

    String timestamp = dUtc.ToString();
    

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

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

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

    如果你做了类似的事情:

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

    您会得到影响结果的 123 毫秒。您还可以使用 ToStringParseExact 包括几分之一秒,或其他获取 DateTime 的方法。

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

    【讨论】:

    • 感谢您的详细解答。我想挑战是有缺陷的思维。因为我希望两个日期之间的毫秒 差异 并且任何给定日期都必须可以表示为毫秒数。但是,我想,这并不是 DateTime 数学真正发生的事情。该用例是将演示格式的日期字符串转换为 DateTime 对象,然后进行处理。我查看了 MSDN 文章“如何:在日期和时间值中显示毫秒”,但我无法让它为我工作。
    • 如果用例要求您解析字符串,那么末尾的 000 可能就可以了。这可能只是因为毫秒自 1970 年以来是某些系统中日期的常见内部表示,并且与此有关。
    • 经过思考,我相信我对计算日期数学时实际发生的情况有了更好的理解。我有一个工具,它应该在 epoch time 内产生值,但有时会以毫秒为单位,有些以秒为单位。这显然是一个错误,但对我来说是一个黑匣子。所有这些问题的最终目的是制作最简单的工具来计算这些差异。我不喜欢做我不了解它们如何工作的事情。 ;-)
    【解决方案2】:

    默认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 以减少输入。或者,在这种情况下,考虑完全避免转换:-)

    数学是正确的。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2023-03-27
        • 1970-01-01
        • 2013-11-03
        • 2014-03-14
        • 2020-12-04
        • 2016-04-17
        • 2021-04-01
        • 2012-03-08
        • 2014-11-26
        相关资源
        最近更新 更多