摘要:[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/