2015-09-04 51 views
0

我具有类似于Borland的TDateTime类型到.NET日期时间转换

How to convert a double value to a DateTime in c#?

我有的TIMEDATE信息被拉动为8字节从UDP数据流长的数的最新的转换问题。这是Borland C++中的TDateTime对象的双精度编码,它与COM datetime兼容。

我在Visual Studio C#中解码这个数据流,并且任何对DateTime对象的转换都会出现奇怪的日期。

我认为DateTime.FromBinary()可能会做到这一点,但这并不能正确解码时间/日期。

用于现在的十六进制值()是在两个系统之间广泛不同:

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

这些值取自彼此几秒但显然是不同的。

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

+1

您链接到的问题已经给出了准确的答案:使用'DateTime.FromOADate',而不是'DateTime.FromBinary'。如果你有一些没有涉及的问题,请问你真的在做什么。 – hvd

+0

不是:他说他有'40880.051388'。我有0x40E4A17C20782C71。我'真正追求的'是从我所拥有的东西到他所拥有的东西的转换,或者是从我从数据到DateTime的直接转换。 – user3235770

+0

所以你有问题反序列化你的二进制数据为双? – hvd

回答

0

BitConverterHow to convert a byte array to double array in C#?)与DateTime.FromOADate从(How to convert a double value to a DateTime in c#?)相结合是你所追求的:

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

注意 - 这取决于你如何读取的字节,你可能需要使用非0偏移(如果你阅读字节数组),并且可能不需要Reverse(可能取决于系统之间的字节顺序)。同样取决于你读取数据的方式,例如BinaryReader.ReadDouble可能是更好的选项,从传入的二进制数据中获得double

+0

我想如果你执行这段代码,它会抛出一个非法的日期时间异常(它对我来说)。当我插入'合法'双倍时,它返回12/30/1899 12点钟......排列顺序似乎并不重要;它带有和没有Reverse()时返回相同。 – user3235770

+0

@ user3235770我很确定,如果我执行代码,它会正常工作:http://ideone.com/8srPSN –

+0

我的歉意;这确实是正确的! – user3235770