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 Automation日期值的二进制表示?
因此,您应该从数组中获取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);
}
这看起来很有效。。。基本上CCD_ 5只是返回一个表示,其中底部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()
反序列化DateTime
的.NET特定序列化版本。它只适用于DateTime.ToBinary()
调用生成的二进制数据,而不适用于任何标准输入数据。
由于.NET DateTime
类在Java中不存在,因此没有等效的Java。
如果您试图将.NET DateTime
对象保存为二进制格式,并将其读入Java应用程序,则应该使用不同的格式。例如,自UNIX epoch以来的秒数。
C#的二进制序列化是.NET特有的,因为它将Ticks属性序列化为Int64,此外还将Kind属性序列化,而Javas DateTime通常基于unixtime(自1970年以来为毫秒(。
因此,我认为您在Java中找不到等效的框架。看看这个StackOverflow帖子,了解如何在Java中获得Ticks等价物:C#DateTime.Ticks等价物在Java 中
我也会给Joda Time一个快速的机会。也许你会在那里找到一种实用的方法。
您应该选择一种更有意义的交换格式。
-
如果可以传递字符串,请使用ISO-8601格式。在.Net中,您将使用
yourDateTime.ToString("o")
。 -
如果您想要更紧凑的东西,请传递一个时间戳,例如自1970年1月1日UTC以来的长整数毫秒。
不要通过DateTime.ToBinary
的输出。你必须在Java中实现很多不值得的东西
-
DateTime
的Kind
属性被嵌入作为数据的一部分。你必须过滤掉并解释它。Java中没有任何直接的等价物。 -
您可以在.Net Framework参考源中看到,
FromBinary
必须处理各种时区转换,以防您在一个时区中序列化具有Local
类型的DateTime
,并在另一个时区对其进行反序列化。