我正在尝试将DateTime转换为Julian日期并在Windows 7下将其反转。
public static double ToJulianDate(this DateTime dt) {
return dt.ToOADate() + 2415018.5;
}
public static DateTime Julian2DT(this double julian) {
return DateTime.FromOADate(julian - 2415018.5);
}
当我测试这两个函数时,如下所示
var dt = DateTime.Now;
dt.ToString("yyyy-MM-dd HH:mm:ss.ffffff").Dump();
dt.ToJulianDate().Julian2DT().ToString("yyyy-MM-dd HH:mm:ss.ffffff").Dump();
反转的Julian日期总是与原始DateTime值略有不同,相差数百微秒。
我是否编写了错误的代码或者Windows时间系统中存在一些微秒的不准确性?
答案 0 :(得分:1)
这是朱利安日期表示为double
这一事实的自然结果,其总是具有有限的准确性。例如,当前值约为2456348.78370906。这在小数点前给出了7位有效数字 - 而double
只能精确到“约”15位小数。因此,我们在小数部分内有大约8个十进制数字的精确度......这意味着代表一天。
现在1天/ 100000000 = 0.000864秒。所以我只希望精度不到一毫秒。
如果不为朱利安日期添加常量,事情看起来更加乐观 - 此时当前值仅为41330左右,因此精度值中有更多“空间”就一天中的时间而言。基本上,从绝对值来看,浮点值越大,精度越差。 (相邻值之间的差距变大。)