.NET日期时间,转换和OADate当不同的分辨率? [英] .NET DateTime, different resolution when converting to and from OADate?

查看:1274
本文介绍了.NET日期时间,转换和OADate当不同的分辨率?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我转换日期时间为OADate。我期待转换OADate回来时,得到完全相同的日期时间,但现在它只有毫秒级的分辨率,因此是不同的。

I'm converting a DateTime to OADate. I was expecting to get the exact same DateTime when converting the OADate back, but now it has only millisecond resolution, and is therefore different.

var a = DateTime.UtcNow;
double oadate = a.ToOADate();
var b = DateTime.FromOADate(oadate);
int compare = DateTime.Compare(a, b); 

//Compare is not 0; the date times are not the same

滴答:634202170964319073

Ticks from a: 634202170964319073

从B蜱:634202170964310000

Ticks from b: 634202170964310000

在OADate双:40437.290467951389

The OADate double: 40437.290467951389

,这是什么原因呢?日期时间的分辨率显然是不够好。

What is the reason for this? The resolution of DateTime is clearly good enough.

推荐答案

在调用ToOADate静态方法明确划分蜱10000,然后将结果存储在一个长期的,从而消除任何子毫秒资讯

The static method called by ToOADate clearly divides the ticks by 10000 and then stores the result in a long, thus removing any sub millisecond info

有谁知道在哪里可以找到OADate格式的规格?

Does anyone know where to find the specs of the OADate format?

    private static double TicksToOADate(long value)
    {
        if (value == 0L)
        {
            return 0.0;
        }
        if (value < 0xc92a69c000L)
        {
            value += 0x85103c0cb83c000L;
        }
        if (value < 0x6efdddaec64000L)
        {
            throw new OverflowException(Environment.GetResourceString("Arg_OleAutDateInvalid"));
        }
        long num = (value - 0x85103c0cb83c000L) / 0x2710L;
        if (num < 0L)
        {
            long num2 = num % 0x5265c00L;
            if (num2 != 0L)
            {
                num -= (0x5265c00L + num2) * 2L;
            }
        }
        return (((double)num) / 86400000.0);
    }

这篇关于.NET日期时间,转换和OADate当不同的分辨率?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆