[Delphi][C#] Delphi TDateTime to C# DateTime

  • 4711
  • 0

摘要:[Delphi][C#] Delphi TDateTime to C# DateTime

這樣主題應該分為兩個部分

○ 從檔案讀取資料

○ Delphi TDateTime 轉 C# DateTime

 

In Delphi

首先我們把時間寫進檔案當中


var
  pWritten: DWORD;
  LogTime: TDataTime;

begin
  LogTime:=now;
  WriteFile(FFileHandle, LogTime, SizeOf(LogTime), pWritten, nil);

 

然後開始檔案時可以看見LogTime已經寫進檔案當中(8 byte)

假設我們在Delphi使用now時的值是  2012/1/17 上午 09:42:39

而寫入檔案當中將變成  d6 49 b7 f2 ac fb e3 40

查了一下delphi的TDateTime其實為Double

 

為了在C#的接收程式當中能夠讀取並且解成DateTime我們必須做以下幾件事情

 


        static void Main(string[] args)
        {
            //假設我們已經從File當中取出這些數值(8 byte)
            byte[] longDateTime = { 0xd6, 0x49, 0xb7, 0xf2, 0xac, 0xfb, 0xe3, 0x40 };

            //因為寫入檔案的時候數值小的會出現在前面 (little endian)
            //所以先做數值重新排序動作
            //以上面數值d6 49 b7 f2 ac fb e3 40為例
            //將會對調成40 e3 fb ac f2 b7 49 d6
            //然後轉成long(給DateTime使用)
            long longNum = (long)(longDateTime[7]) << 56 | (long)(longDateTime[6] & 0xff) << 48 |
                (long)(longDateTime[5] & 0xff) << 40 | (long)(longDateTime[4] & 0xff) << 32 |
                (long)(longDateTime[3] & 0xff) << 24 | (long)(longDateTime[2] & 0xff) << 16 |
                (long)(longDateTime[1] & 0xff) << 8 | (long)(longDateTime[0] & 0xff);

            //將long轉換成double
            //嘗試過使用Convert.ToDouble,但數值並不符合DateTime使用
            double doubleTime= BitConverter.Int64BitsToDouble(longNum);


            //要知道這行為什麼是這個數值要先知道幾件事
            //Delphi中TDateTime初始時間為     1899/12/30 00:00:00
            //C#中DateTime的初始值為          0001/01/01 00:00:00
            //DateTime是初始日期(Ticks=0) + offset而成
            
            const double DAYS_BETWEEN_00010101_AND_18991230 = 693593;

            //以下三行程式碼就可以得到與上面693593相同數值
            //DateTime delphiTime = new DateTime(1899, 12, 30, 0, 0, 0);
            //DateTime cSharpTime = new DateTime();
            //double period = new TimeSpan(delphiTime.Ticks - cSharpTime.Ticks).Days;

            //24 * 60 *60 *1000 * 1000  *10
            const double TIME_UNIT = 864000000000;


            //C# DateTime 為 delphi中所存的日期 + C#與Delphi日期格式初始值的差異
            DateTime date = new DateTime((long)((doubleTime + DAYS_BETWEEN_00010101_AND_18991230) * TIME_UNIT));
            Console.WriteLine(date.ToString());
            Console.ReadLine();
        }

 

這樣就可以進行兩種不同語言間的轉換

Reference: http://forth.wordpress.com/2006/07/29/java%E5%92%8Cdelphi%E6%99%82%E9%96%93%E6%8F%9B%E7%AE%97/