Borland TDateTime到.net DateTime的转换

本文关键字:转换 DateTime net TDateTime Borland | 更新日期: 2023-09-27 18:11:20

我有一个类似于

的数字到日期转换问题

如何在c#中转换双精度值到日期时间?

我所拥有的时间信息是从UDP数据流中提取的8字节长。它被编码为来自Borland c++中的TDateTime对象的double,它与COM datetime具有兼容性。

我在visual studio c#中解码这个数据流,任何对DateTime对象的转换都会产生奇怪的日期。

我认为DateTime.FromBinary()可能会奏效,但这也不能正确解码时间/日期。

现在()的十六进制值在两个系统之间有很大的不同:

Borland: 0x 40E4A17C20782C71
C#     : 0x 8E6EA19D6CB5D288

这些值彼此相隔几秒钟,但明显不同。

如果有人对如何转换这个有任何建议,我将不胜感激!

Borland TDateTime到.net DateTime的转换

BitConverter(如何在c#中将字节数组转换为双数组?)与DateTime.FromOADate(如何在c#中将双值转换为日期时间?)相结合是您所追求的:

var date = DateTime.FromOADate(BitConverter.ToDouble(
    (new byte[]{0x40,0xE4,0xA1,0x7C,0x20,0x78,0x2C,0x71}).Reverse().ToArray(),
  0));

注意-根据你读取字节的方式,你可能需要使用非0偏移(如果你读取字节数组),可能不需要Reverse(可能取决于系统之间的endianness)。还取决于您读取数据的方式,如BinaryReader.ReadDouble可能是从传入的二进制数据中获得double的更好选择。