C# 以微秒为单位的日期时间

C# 以微秒为单位的日期时间,c#,datetime,time,double,precision,C#,Datetime,Time,Double,Precision,以微秒为单位的日期时间值是否转换为精确的双精度值 例如,我的日期为2017年7月3日10:00:00 Ticks 636346728000000050。当我得到42919.4166666667时,它转换为双倍。同样,我已将50个刻度添加到当前日期,即2017年7月3日10:00:00 00刻度6363634672800000100,转换为双精度,也获得相同的双精度值,但刻度值已添加到日期中 通过此方法将我转换为doubledate.ToOADate() 谁能解决这个问题 提前感谢:)50个刻度不

以微秒为单位的日期时间值是否转换为精确的双精度值

例如,我的日期为2017年7月3日10:00:00 Ticks 636346728000000050。当我得到42919.4166666667时,它转换为双倍。同样,我已将50个刻度添加到当前日期,即2017年7月3日10:00:00 00刻度6363634672800000100,转换为双精度,也获得相同的双精度值,但刻度值已添加到日期中

通过此方法将我转换为doubledate.ToOADate()

谁能解决这个问题


提前感谢:)

50个刻度不能用OLE自动化日期表示。此代码:

DateTime d1 = DateTime.Parse("3 July 2017 10:00:00");
DateTime d2 = d1.AddTicks(100);
double o2 = d2.ToOADate();
Console.WriteLine(o2);

DateTime d3 = d1.AddTicks(1000);
double o3 = d3.ToOADate();
Console.WriteLine(o3);

DateTime d4 = d1.AddTicks(10000); 
double o4 = d4.ToOADate();
Console.WriteLine(o4);
生成输出:

42919,4166666667
42919,4166666667
42919,4166666782

因此,您至少需要10000个刻度,添加才会产生影响。

50个刻度不能用OLE自动化日期表示。此代码:

DateTime d1 = DateTime.Parse("3 July 2017 10:00:00");
DateTime d2 = d1.AddTicks(100);
double o2 = d2.ToOADate();
Console.WriteLine(o2);

DateTime d3 = d1.AddTicks(1000);
double o3 = d3.ToOADate();
Console.WriteLine(o3);

DateTime d4 = d1.AddTicks(10000); 
double o4 = d4.ToOADate();
Console.WriteLine(o4);
生成输出:

42919,4166666667
42919,4166666667
42919,4166666782

因此,您需要至少10000个刻度才能使添加产生影响。

这里有两个独立的逻辑操作:

  • 从滴答声转换为微秒。这基本上是一个除以10的问题(每个滴答声中有100纳秒或0.1微秒),因此在整数运算中可能会丢失信息-但是加上50个滴答声正好等于加上5微秒,所以应该可以

  • 从整数到二进制浮点数的转换。您的值有17个有效的十进制数字,这是64位二进制浮点类型可以表示的高端。您不应该依赖超过15个有效的十进制数字

最重要的是,您使用的是
ToOADate
,它看起来有毫秒的精度,查看

因此:

  • 您可以将
    滴答声
    除以10得到微秒,只会损失少量精度
  • 您可以以不同的方式将
    long
    转换为
    double
    ,这样会比
    ToOADate
    丢失更少的信息,但在许多情况下仍然会丢失信息
  • 如果除以10.0(因此避免使用整数运算),那么根据要表示的值,可以避免丢失任何信息

如果您能够为
double
值选择不同的历元,您可以轻松地以适当的精度表示微秒值-但您需要知道需要表示的值的范围,以便进行检查,以及使用生成的
双值来控制代码的其余部分。

这里有两个独立的逻辑操作:

  • 从滴答声转换为微秒。这基本上是一个除以10的问题(每个滴答声中有100纳秒或0.1微秒),因此在整数运算中可能会丢失信息-但是加上50个滴答声正好等于加上5微秒,所以应该可以

  • 从整数到二进制浮点数的转换。您的值有17个有效的十进制数字,这是64位二进制浮点类型可以表示的高端。您不应该依赖超过15个有效的十进制数字

最重要的是,您使用的是
ToOADate
,它看起来有毫秒的精度,查看

因此:

  • 您可以将
    滴答声
    除以10得到微秒,只会损失少量精度
  • 您可以以不同的方式将
    long
    转换为
    double
    ,这样会比
    ToOADate
    丢失更少的信息,但在许多情况下仍然会丢失信息
  • 如果除以10.0(因此避免使用整数运算),那么根据要表示的值,可以避免丢失任何信息

如果您能够为
double
值选择不同的历元,您可以轻松地以适当的精度表示微秒值-但您需要知道需要表示的值的范围,以便进行检查,以及使用生成的
值控制其余代码。

转换函数ToOADate不支持如此小的差异。50个刻度为50*100ns=5μs

如果您检查其他函数,如SystemTimeToVariantTime或VariantTimeToSystemTime,您会发现它们的精度更高,限制为1秒

提供允许毫秒精度的代码

OLE日期的当前分辨率约为629ns,这是两个双精度日计数(整数部分)的差值,约为44057(如今天),因此低于7个刻度的所有内容都不会产生差异

计算改进的OLE日期的一个选项是将ODate转换回DateTime,然后根据刻度差更正OLE日期:

DateTime now = DateTime.Now;
double olenow = now.ToOADate();
DateTime oanow = DateTime.FromOADate(olenow);
double betterolenow = olenow + ((double)(now.Ticks - oanow.Ticks) ) / (24L * 3600 * 1000 * 10000);

转换函数ToOADate不支持如此小的差异。50个刻度为50*100ns=5μs

如果您检查其他函数,如SystemTimeToVariantTime或VariantTimeToSystemTime,您会发现它们的精度更高,限制为1秒

提供允许毫秒精度的代码

OLE日期的当前分辨率约为629ns,这是两个双精度日计数(整数部分)的差值,约为44057(如今天),因此低于7个刻度的所有内容都不会产生差异

计算改进的OLE日期的一个选项是将ODate转换回DateTime,然后根据刻度差更正OLE日期:

DateTime now = DateTime.Now;
double olenow = now.ToOADate();
DateTime oanow = DateTime.FromOADate(olenow);
double betterolenow = olenow + ((double)(now.Ticks - oanow.Ticks) ) / (24L * 3600 * 1000 * 10000);

在测量时间时没有“精确精度”这样的东西。为什么要将其转换为双精度?在我的要求中,我已将某些操作转换为双精度。“我已添加了50个刻度”-如何?日期时间是不可变的。这里还有很多不清楚的地方,所以写一个.Double是一个浮点值wh