2015-09-04 26 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

相關問題