2009-11-19 27 views
5

Tôi biết cách sử dụng mã hóa trong Delphi để mã hóa từng YY, MM và DD thành trường datetime hoặc sử dụng mã hóa để mã hóa HH, SS, MM và MS thành trường datetime nhưng có cách để xác định cả ngày tháng và thời gian vào một trường datetime?Tôi biết cách sử dụng mã hóa trong Delphi

Coz có mã hóa Tôi không thể chỉ định thời gian và với mã hóa Tôi không thể chỉ định ngày ...

ví dụ: làm cách nào để tôi có thể đặt trường ngày giờ thành 2009-11-28 14: 23: 12.000

Vui lòng trợ giúp.

Cảm ơn.

Trả lời

31

Thử sử dụng hàm EncodeDateTime được khai báo trong đơn vị DateUtils.

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

Xem ví dụ này

uses 
DateUtils; 

var 
    myDateTime : TDateTime; 

begin 

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


End; 

Một tùy chọn khác

uses 
SysUtils; 

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

Lựa chọn thứ hai làm việc vì TDatetime Nó được lưu giữ như một đôi (TDateTime = type Double;), với ngày như phần tách rời (hàm EncodeDate trả về tích phân) và thời gian là phần phân đoạn.

Phần ngày của TDateTime đại diện cho số ngày đã trôi qua kể từ ngày 12/30/1899. TDateTime có thể là bất kỳ ngày nào qua ngày 31 tháng 12 năm 9999 (giá trị thập phân 2,958,465), giá trị TDateTime cũng có thể âm. Giá trị thập phân -693.593 tương ứng với 1 tháng 1 0001.

thấy đề tài ví dụ

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; 

Quan trọng Lưu ý từ trang web của Embarcadero:

Để tìm số phân đoạn của ngày giữa hai ngày , chỉ cần trừ hai giá trị, trừ khi một trong các giá trị System.TDateTime là số âm. Tương tự, để tăng ngày và giá trị thời gian theo một số phân đoạn nhất định số ngày, hãy thêm số phân đoạn phân đoạn vào giá trị ngày và giờ nếu giá trị System.TDateTime là .

Khi làm việc với tiêu cực Hệ thống.Giá trị thời gian, tính toán phải xử lý phần thời gian riêng biệt. Phần phân số phản ánh phần của một ngày 24 giờ mà không cần liên quan đến dấu hiệu của giá trị System.TDateTime. Ví dụ: 6:00 sáng ngày 12/29/1899 là –1,25, không phải -0,25, sẽ là -0,75. Không có giá trị System.TDateTime nào giữa –1 và 0.

để biết thông tin addtional bạn có thể thấy liên kết này

+2

tôi sẽ bỏ phiếu này lên nếu bạn giải thích lý do tại sao * * sự tùy chọn thứ hai hoạt động và tại sao nó là an toàn để làm điều đó như thế này. Nếu OP biết rằng anh sẽ không cần phải hỏi. Để trích dẫn Raymond Chen: "Nếu bạn không hiểu tại sao phải làm một việc gì đó, thì bạn đã rơi vào cái bẫy của chương trình giáo phái hàng hóa" (http://blogs.msdn.com/oldnewthing/archive/2009/11/ 04/9917052.aspx) – mghie

+2

Tùy chọn thứ hai không hoạt động và không an toàn :-) Nó * sẽ * hoạt động vào ngày * sau * 12/30/1899, nhưng không vào ngày trước ngày đó (ngày mã hóa thành số âm phủ định) –

+4

+1 câu trả lời tuyệt vời và chi tiết – jpfollenius

0

Embarcadero khẳng định: Không có giá trị System.TDateTime giữa -1 và 0.

Thậm chí Embarcadero làm dường như không biết. Đây cũng là một lỗi trong helpfile từ Delphi 7

nó nên được, không có giá trị System.TDateTime giữa 0 và 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 
Các vấn đề liên quan