什么是Java中的DateTime.FromOADate()(Java中的日期时间为double)

Seç*_*gay 3 .net c# java datetime

C#有一个DateTime.FromOADate()方法.

什么是相当于DateTime.FromOADate()Java的

这是我的C#代码:

var b = new byte[8];
b[0] = 0x20;
b[1] = 0x64;
b[2] = 0xa8;
b[3] = 0xac;
b[4] = 0xb6;
b[5] = 0x65;
b[6] = 0xe4;
b[7] = 0x40;
var dbl = BitConverter.ToDouble(b, 0);
var dt = DateTime.FromOADate(dbl);
Run Code Online (Sandbox Code Playgroud)

这是输出:

2014-05-14T17:00:21

如何将此字节数组转换为java?

Jon*_*eet 5

这看起来很有效......基本上ToBinary只返回一个表示,其中底部58位是自UTC中的BCL纪元以来的刻度.这段代码恰好反过来

private static final long UNIX_EPOCH = 62135596800000L;
public static Date fromDateTimeBinary(long value) {
    // Mask off the top bits, which hold the "kind" and
    // possibly offset.
    // This is irrelevant in Java, as a Date has no
    // notion of time zone
    value = value & 0x3fffffffffffffffL;
    // A tick in .NET is 100 nanoseconds. So a millisecond
    // is 10,000 ticks.
    value = value / 10000;
    return new Date(value - UNIX_EPOCH); 
}
Run Code Online (Sandbox Code Playgroud)

我已经测试过"本地" DateTime和"UTC" DateTime.它将"未指定" DateTime视为UTC.

总的来说,它并不理想,你应该在任何地方与数据进行对话,以尝试更改为更便携的格式,但在此之前这应该有所帮助.尽管进一步测试!


ali*_*hoo 5

您是否意识到您的二进制数据是OLE自动化日期值的二进制represantation ?

因此long,您应该double从数组中获取值,而不是获取.

var b = new byte[8];
b[0] = 0x20;
b[1] = 0x64;
b[2] = 0xa8;
b[3] = 0xac;
b[4] = 0xb6;
b[5] = 0x65;
b[6] = 0xe4;
b[7] = 0x40;
var dbl = BitConverter.ToDouble(b, 0);
var dt = DateTime.FromOADate(dbl);
Console.WriteLine("{0:s}", dt);
Run Code Online (Sandbox Code Playgroud)

结果是:

2014-05-14T17:00:21
Run Code Online (Sandbox Code Playgroud)

我认为有效的问题应该是:Java中的DateTime.FromOADate()相当于什么?

答案是:

public static Date fromDoubleToDateTime(double OADate) 
{
    long num = (long) ((OADate * 86400000.0) + ((OADate >= 0.0) ? 0.5 : -0.5));
    if (num < 0L) {
        num -= (num % 0x5265c00L) * 2L;
    }
    num += 0x3680b5e1fc00L;
    num -=  62135596800000L;

    return new Date(num);
}
Run Code Online (Sandbox Code Playgroud)