什么是Java中的DateTime.FromOADate()(在Java中是日期时间的两倍)

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

Java中DateTime.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?

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

因此,您应该从数组中获取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中的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); } 

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

我已经测试过“本地” DateTime和“UTC” DateTime 。 它会将“未指定的” DateTime视为UTC格式。

总的来说,这并不理想,你应该在任何你从中获取数据的地方进行交谈,以尝试更改为更便携的格式,但在此之前这应该有所帮助。 尽管进一步测试!

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

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

如果您尝试将.NET DateTime对象保存为二进制格式,并将其读入Java应用程序,则应使用其他格式。 例如,自UNIX纪元以来的秒数。

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

所以我认为你不会在Java中找到一个等价的框架。 看一下这篇StackOverflow文章,了解如何在Java中获得Ticks等效信息: C#DateTime.Ticks等效于Java

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

您应该选择更有意义的交换格式。

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

  • 如果你想要更紧凑的东西,可以传递时间戳 – 例如自1970年1月1日UTC以来的长整数毫秒。

不传递DateTime.ToBinary的输出。 您将不得不在Java中实现许多不值得的东西。 特别:

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

  • 您可以在.Net Framework Reference Source中看到, FromBinary必须处理各种时区转换 – 如果您在一个时区中序列化具有Local类型的DateTime并在另一个时区中反序列化它。