C# 获取任意日期和纪元时间之间经过的毫秒数

C# 获取任意日期和纪元时间之间经过的毫秒数,c#,datetime,date-math,C#,Datetime,Date Math,如果我写一个简单的方法来返回epoch-time和DateTime.UtcNow之间的毫秒数,我会得到一个正确的答案。但是,如果我编写一个方法来返回任意日期和纪元时间之间的毫秒数,则最后三位数字始终为零“任意日期”表示我将DateTime.parseArbital日期字符串的输出传递给方法。据我所知,.Parse返回的DateTime对象并没有返回所有有效数字 试验方法: static void GetMillis() { DateTime dUt

如果我写一个简单的方法来返回epoch-time和DateTime.UtcNow之间的毫秒数,我会得到一个正确的答案。但是,如果我编写一个方法来返回任意日期和纪元时间之间的毫秒数,则最后三位数字始终为零“任意日期”表示我将DateTime.parseArbital日期字符串的输出传递给方法。据我所知,.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

默认的DateTime.ToString格式不包括毫秒,这是数据丢失的地方;它发生在解析之前。要获取字符串表示形式中的毫秒数,请使用自定义格式:

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
注意少打字。或者,在这种情况下,考虑完全避免转换:-< /P> 数学是合理的。

默认的DateTime.ToString格式不包括毫秒,这是数据丢失的地方;它发生在解析之前。要获取字符串表示形式中的毫秒数,请使用自定义格式:

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
注意少打字。或者,在这种情况下,考虑完全避免转换:-< /P>
数学是正确的。

您想检查以下中间值:

String timestamp = dUtc.ToString();
它返回的内容取决于您的本地设置,但会是8/26/2012 11:12:31,精确到最接近的秒

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

因此,从epoch开始的毫秒数方法在该点上有零是正确的

但是,如果您做了如下操作:

arbitrary = new DateTime(2012, 8, 26, 11, 12, 31, 123);
你会得到影响结果的123毫秒。您还可以使用ToString和ParseExact,其中包括几分之一秒,或者一系列其他获取日期时间的方法


总的来说,从epoch开始的毫秒运行得很好,但是获取日期以测试它的方法是有缺陷的。

您想检查以下中间值:

String timestamp = dUtc.ToString();
它返回的内容取决于您的本地设置,但会是8/26/2012 11:12:31,精确到最接近的秒

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

因此,从epoch开始的毫秒数方法在该点上有零是正确的

但是,如果您做了如下操作:

arbitrary = new DateTime(2012, 8, 26, 11, 12, 31, 123);
你会得到影响结果的123毫秒。您还可以使用ToString和ParseExact,其中包括几分之一秒,或者一系列其他获取日期时间的方法


总的来说,从epoch开始的毫秒运行得很好,但是你获取日期来测试它的方法是有缺陷的。

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

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

感谢您提供的详细答案。我想挑战在于有缺陷的思维。因为我想要两个日期之间的毫秒差,任何给定的日期都必须表示为毫秒数。但是,我想,DateTime数学并不是这样的。用例是将演示格式的日期字符串转换为DateTime对象,然后进行处理。我已经阅读了MSDN的文章《如何:在日期和时间值中显示毫秒》,但我还不能让它对我起作用。如果用例要求您解析字符串,那么结尾的000可能就可以了。这可能是因为自1970年以来的毫秒数是某些系统中日期的常见内部表示形式,并且与此相关。经过思考,我相信我对计算日期数学时实际发生的情况有了更好的理解。我有一个工具,它应该在大纪元时间内产生值,但有时会以毫秒和秒为单位输出。这显然是一个bug,但对我来说却是一个黑盒子。所有这些问题的最终目的是制作最简单的工具来计算这些微分。我不喜欢做那些我不明白它们是如何工作的事情-谢谢你的详细回答。我想挑战在于有缺陷的思维。因为我想要两个日期之间的毫秒差,任何给定的日期都必须被压缩
以毫为单位表示的。但是,我想,DateTime数学并不是这样的。用例是将演示格式的日期字符串转换为DateTime对象,然后进行处理。我已经阅读了MSDN的文章《如何:在日期和时间值中显示毫秒》,但我还不能让它对我起作用。如果用例要求您解析字符串,那么结尾的000可能就可以了。这可能是因为自1970年以来的毫秒数是某些系统中日期的常见内部表示形式,并且与此相关。经过思考,我相信我对计算日期数学时实际发生的情况有了更好的理解。我有一个工具,它应该在大纪元时间内产生值,但有时会以毫秒和秒为单位输出。这显然是一个bug,但对我来说却是一个黑盒子。所有这些问题的最终目的是制作最简单的工具来计算这些微分。我不喜欢做那些我不明白它们是如何工作的事情-