none
如何將 VC6 COleDateTime 轉為 VB.NET Date RRS feed

  • 問題

  • Hi All

    請問一下:

    我在VB.NET讀取一個 FileStream , FileStream中有一段是 VC6 COleDateTime 的時間型態 , 我對照前後讀取的資料那段大小是 12 Byte , 請問一下這段 Byte Array 要如何轉為 VB.NET的Date型態 ?

    以下是我的程式碼
    Dim fStream As FileStream Dim biReader As BinaryReader

    fStream = New FileStream(FileAddress, FileMode.Open) biReader = New BinaryReader(fStream)

    ' 中間讀取其他資料...

    Dim DateTime() As Byte = biReader.ReadBytes(12)


    DateTime 不知如何轉為 VB.NET Date 型態 ?


    thx
    2008年10月24日 上午 08:28

解答

  • ?

    根據線上手冊:

    ms-help://MS.MSDNQTR.v80.cht/MS.MSDN.v80/MS.VisualStudio.v80.cht/dv_vclib/html/e718f294-16ec-4649-88b6-a4dbae5178fb.htm

    Code Snippet

     

    COleDateTime Class

     

    Encapsulates the DATE data type used in OLE automation.

     

    Remarks

     

    COleDateTime does not have a base class.

    It is one of the possible types for the VARIANT data type of OLE automation. A COleDateTime value represents an absolute date and time value.

    The DATE type is implemented as a floating-point value, measuring days from midnight, 30 December 1899. So, midnight, 31 December 1899 is represented by 1.0. Similarly, 6 AM, 1 January 1900 is represented by 2.25, and midnight, 29 December 1899 is – 1.0. However, 6 AM, 29 December 1899 is – 1.25.

     

    這表示 COleDateTime 就是 Variant Date ,那應該只有 8 bytes

     

    先用 Double 讀,再用 DateTime.FromOADate(Double) 轉。

     

    把所代表的時間值貼出來,再把 12 bytes 貼出來,有可能有 4 bytes 是 Variant Type 的描述用,不過 Variant Type 是 2 bytes 的,我也不確定為啥是 12 bytes ...

    2008年10月24日 上午 09:07

所有回覆

  • HI,

     

    這裏有人製作好型態轉換的類別:

    http://www.marshal-as.net

     

    tihs

    2008年10月24日 上午 08:52
  • ?

    根據線上手冊:

    ms-help://MS.MSDNQTR.v80.cht/MS.MSDN.v80/MS.VisualStudio.v80.cht/dv_vclib/html/e718f294-16ec-4649-88b6-a4dbae5178fb.htm

    Code Snippet

     

    COleDateTime Class

     

    Encapsulates the DATE data type used in OLE automation.

     

    Remarks

     

    COleDateTime does not have a base class.

    It is one of the possible types for the VARIANT data type of OLE automation. A COleDateTime value represents an absolute date and time value.

    The DATE type is implemented as a floating-point value, measuring days from midnight, 30 December 1899. So, midnight, 31 December 1899 is represented by 1.0. Similarly, 6 AM, 1 January 1900 is represented by 2.25, and midnight, 29 December 1899 is – 1.0. However, 6 AM, 29 December 1899 is – 1.25.

     

    這表示 COleDateTime 就是 Variant Date ,那應該只有 8 bytes

     

    先用 Double 讀,再用 DateTime.FromOADate(Double) 轉。

     

    把所代表的時間值貼出來,再把 12 bytes 貼出來,有可能有 4 bytes 是 Variant Type 的描述用,不過 Variant Type 是 2 bytes 的,我也不確定為啥是 12 bytes ...

    2008年10月24日 上午 09:07
  • Hi

    感謝兩位大大的回答

    心冷熱情熄大大說的沒錯,它是 8 bytes,我後來多試幾個檔案發現前4個bytes都是0
    照您的方法順利解決 。

    我後來的程式碼如下

    Dim DTArray() As Byte = biReader.ReadBytes(12)

    Dim DTDouble As Double = BitConverter.ToDouble(DTArray, 4)

    Dim DateTime As Date = Date.FromOADate(DTDouble)

    讀出來的值就是正確的了,再次感謝 。

    2008年10月27日 上午 03:55
  • 如果你這方面有比較大的需求,可以看看這邊有一些轉換用的:

    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Module&Module=6

     

    以你這個例子來說,是這個:

    ByteToVariant

     

    2008年10月27日 上午 05:41