有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

c#DateTime的等价物是什么。Java中的FromOADate()(Java中的double to Datetime)

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

JavaDateTime.FromOADate()的等价物是什么

这是我的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);

这是输出:

2014-05-14T17:00:21

如何将这个字节数组转换为java


共 (5) 个答案

  1. # 1 楼答案

    DateTime.FromBinary()反序列化。NET特定的DateTime序列化版本。它只适用于DateTime.ToBinary()调用生成的二进制数据,而不适用于任何标准输入数据

    没有Java等价物,因为。NET DateTime类在Java中不存在

    如果你想救一个孩子。NET DateTime对象转换为二进制格式,并将其读入Java应用程序,则应使用不同的格式。例如,UNIX时代以来的秒数

  2. # 2 楼答案

    你应该选择一种更有意义的交换格式

    • 如果可以传递字符串,请使用ISO-8601格式。在里面Net中使用yourDateTime.ToString("o")

    • 如果你想要更紧凑的东西,可以传递一个时间戳——比如从1/1/1970 UTC开始的毫秒长整数

    不要传递DateTime.ToBinary的输出。你必须用Java实现很多不值得的东西。具体来说:

    • DateTimeKind属性作为数据的一部分嵌入。你必须把它过滤掉,然后解释它。Java中没有任何直接的等价物

    • 你可以看到in the .Net Framework Reference Source,即FromBinary必须处理各种时区转换——如果你在一个时区用Local类序列化DateTime,然后在另一个时区反序列化它

  3. # 3 楼答案

    C#的二进制序列化是。NET特定,因为它将Ticks属性序列化为Int64,另外还序列化了Kind属性,而Javas DateTime通常基于unixtime(自1970年以来为millis)

    所以我认为你不会在Java中找到一个等价的框架。看看这篇StackOverflow帖子,了解如何在Java中获得等价的滴答声:C# DateTime.Ticks equivalent in Java

    我也会给Joda-Time一个快速的机会。也许你会在那里找到一种实用的方法

  4. # 4 楼答案

    这看起来很有效。。。基本上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); 
    }
    

    我已经测试了“本地”和“UTC”。它将把一个“未指定的”DateTime视为UTC

    总的来说,这并不理想,你应该与任何你从哪里获取数据的人交谈,尝试将数据转换成更便于携带的格式,但在那之前,这应该会有所帮助。不过,一定要进一步测试

  5. # 5 楼答案

    你知道你的二进制数据是OLE Automation date值的二进制表示吗

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

    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);
    

    结果是:

    2014-05-14T17:00:21
    

    我认为正确的问题应该是:日期时间的等价物是什么。Java中的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);
    }