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