2009-11-19 126 views
5

我知道如何使用Delphi中的編碼器將單個YY,MM和DD編碼到日期時間字段中或使用編碼時間將個別HH,SS,MM和MS編碼到日期時間字段中,但是有沒有將日期和時間指定到日期時間字段的方法?如何在delphi中編碼日期時間

堂妹與encodedate我不能指定的時間和encodetime我不能指定日期...

例如我怎麼可以設置一個日期字段2009-11-28 14:23:12.000

請幫助。

謝謝。

回答

31

嘗試使用EncodeDateTime函數在DateUtils單元declarated。

function EncodeDateTime(const AYear: Word; 
    const AMonth: Word; 
    const ADay: Word; 
    const AHour: Word; 
    const AMinute: Word; 
    const ASecond: Word; 
    const AMilliSecond: Word): TDateTime; 

參見本實施例中

uses 
DateUtils; 

var 
    myDateTime : TDateTime; 

begin 

//Your Code 
myDateTime := EncodeDateTime(2009, 11, 28, 14, 23, 12, 000); 
//Your Code 


End; 

另一個選項

uses 
SysUtils; 

var 
myDateTime : TDateTime; 
begin 
//Your Code 
myDateTime:= EncodeDate(2009,11,28)+EncodeTime(14,23,12,000); 
//Your Code  
end; 

第二種選擇工作,因爲該TDatetime據存儲爲雙(TDateTime = type Double;),與該日期作爲積分部分(EncodeDate函數返回積分),時間爲小數部分。

的TDateTime類型的日期部分表示自12/30/1899已經過去的天數。 TDateTime類型可以通過12月31日9999(十進制值2958465)的任何日期,TDateTime類型值也可以是負數。十進制值-693593對應於1月1日0001

看到Embarcadero公司網站

var 
myDateTime : TDateTime; 

Begin 
myDateTime :=0; //represents 12/30/1899 
myDateTime :=1; //represents 12/31/1899 
myDateTime :=-1; //represents 12/29/1899 
myDateTime :=-693593; //represents 01/01/0001 
myDateTime := Now(); //assign the current date and time to myDateTime 

myDateTime:=Trunc(Now()); //Extract only the date part. 

myDateTime:=Frac(Now()); //Extract only the time part. 

myDateTime :=Now() + 1;// Add a day to the current datetime 


End; 

重要提示論文的例子:

找到兩個日期之間的小數天 的,簡單地減去 兩個值,除非 System.TDateTime值中的一個是負的。 同樣,要將日期和 時間值增加一定的分數 天數,請將分數 數字添加到日期和時間值(如果 System.TDateTime值爲 爲正數)。

當與負 System.TDateTime值工作,計算 必須處理時間部分分別。 小數部分反映而不 關於 System.TDateTime值的符號的 餾分24小時的一天。例如, 上午6:00 1899年12月29日是-1.25,不是-1 + 0.25,這將是-0.75。有 -1和0之間沒有System.TDateTime值。

對於addtional信息,你可以看到這個鏈接

+2

如果你解釋,我會投票這件事*爲什麼*的第二個選項有效,爲什麼這樣做是安全的。如果OP知道他不需要問。引用雷蒙德陳:「如果你不明白爲什麼應該做什麼,那麼你已經陷入了貨物崇拜節目的陷阱」(http://blogs.msdn.com/oldnewthing/archive/2009/11/ 04/9917052.aspx) – mghie 2009-11-19 05:20:18

+2

第二個選項不起作用,並且不安全:-) * *將*在* 12/30/1899之後的日期*上工作,但不在之前的日期(編碼爲負雙) – 2009-11-19 07:33:05

+4

+1偉大而詳細的答案 – jpfollenius 2009-11-19 09:02:29

0

Embarcadero的規定:有介於-1和0

即使Embarcadero公司確實沒有System.TDateTime值似乎不知道。這也是從德爾福7在他們的幫助文件中的錯誤

它應該是,有沒有System.TDateTime值0和1之間

dateValue := EncodeDate(1899,12,30); 
timeValue := EncodeTime(0,0,1,1); 
dateTimeValue := dateValue-timeValue; 
dateTimeValue := -1,1585648148e-05 
DateTimeToStr(dateTimeValue) -> 30-12-1899 0:00:01 

dateValue := EncodeDate(1899,12,30); 
timeValue := EncodeTime(23,59,59,999); 
dateTimeValue := dateValue-timeValue; 
dateTimeValue := -0,99999998843 
DateTimeToStr(dateTimeValue) -> 30-12-1899 23:59:59 

dateValue := EncodeDate(1899,12,31); 
timeValue := EncodeTime(0,0,0,0); 
dateTimeValue := dateValue-timeValue; 
dateTimeValue := 1 
DateTimeToStr(dateTimeValue) -> 31-12-1899 

dateValue := EncodeDate(1899,12,31); 
timeValue := EncodeTime(0,0,0,0); 
dateTimeValue := dateValue+timeValue; 
dateTimeValue := 1 
DateTimeToStr(dateTimeValue) -> 31-12-1899 

dateValue := EncodeDate(1899,12,31); 
timeValue := EncodeTime(0,0,0,1); 
dateTimeValue := dateValue+timeValue; 
dateTimeValue := 1,0000000116 
DateTimeToStr(dateTimeValue) -> 31-12-1899 

dateValue := EncodeDate(1899,12,31); 
timeValue := EncodeTime(23,59,59,999); 
dateTimeValue := dateValue+timeValue; 
dateTimeValue := 1,99999998843 
DateTimeToStr(dateTimeValue) -> 31-12-1899 23:59:59