在Delphi 2010中编码时间问题

时间:2011-02-28 13:45:33

标签: delphi delphi-2010 dbexpress tdatetime

当我们使用EncodeTime函数EncodeTime(wHour,wMinute,wSecond,wMilliseconds)时,它没有将millisec值赋给Result。

我们在下面用来编码日期和时间

Result := EncodeDate(wYear, wMonth, wDay) +
  EncodeTime(wHour, wMinute, wSecond, wMilliseconds);

我们要解析为DateTime的String的值为Apr 10 2008 7:21:31:460PM,但在编码之后,我们得到的输出为10/04/2008 07:21:31

结果仅包含HH:MM:SS值,而不包含毫秒值。

如果有格式化值并将其与millisec一起存储在变量中,请告诉我们。 的 * ** * ** * ** * ** * ** * *** 我正在尝试的功能 * ** * ** * ** * ***

function DateTimeParser(theString :string):TDateTime;
var wYear,wMonth,wDay,wHour, wMinute, wSecond,wMilliseconds : Word  ;
Date,Month,Med :String;
Time : TDateTime;
testtime,testtime1 : TSystemTime;
var  myDateTime : TDateTime;
begin
 Month := Copy(theString,1,3) ;
 if Month ='Jan' then wMonth := 01
     else if  Month ='Feb' then  wMonth := 02
     else if  Month ='Mar' then  wMonth := 03
     else if  Month ='Apr' then  wMonth := 04
     else if  Month ='May' then  wMonth := 05
     else if  Month ='Jun' then  wMonth := 06
     else if  Month ='Jul' then  wMonth := 07
     else if  Month ='Aug' then  wMonth := 08
     else if  Month ='Sep' then  wMonth := 09
     else if  Month ='Oct' then  wMonth := 10
     else if  Month ='Nov' then  wMonth := 11
     else if  Month ='Dec' then  wMonth := 12
     else ShowMessage('Not a Valid Month');
wYear           :=  StrToInt(Copy(theString,8,4)) ;
wDay            :=  StrToInt(Copy(theString,5,2)) ;
wHour           :=  StrToInt(Copy(theString,13,2)) ;
wMinute         :=  StrToInt(Copy(theString,16,2)) ;
wSecond         :=  StrToInt(Copy(theString,19,2)) ;
wMilliseconds   :=  StrToInt(Copy(theString,22,3)) ;

ShowMessage(IntToStr(wMilliseconds));

{if Copy(theString,25,2)= 'PM' then
 wHour := wHour+12;}

Result := DateUtils.EncodeDateTime(wYear, wMonth, wDay,wHour, wMinute, wSecond, wMilliseconds);
//Result := Result+DateUtils.EncodeTime(wHour, wMinute, wSecond, wMilliseconds div 100);

 myDateTime:= EncodeDate(2009,11,28)+EncodeTime(14,23,12,001);
 ShowMessage(DatetimetoStr(myDateTime));
testtime1 := testtime;


Time :=EncodeTime(wHour, wMinute, wSecond, wMilliseconds);
            ShowMessage(DateTimeToStr(Result));

**********************************************************************


end;

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

我可能在这里误解了这个问题,但也许是存储但是你没有看到它。调试器不显示毫秒,DateTimeToStr也不显示。带有格式字符串的FormatDateTime

var
    Date: TDateTime;
begin
    Date := EncodeDateTime(2011, 02, 28, 20, 43, 10, 12);

    //DateTimeToStr does not show milliseconds
    ShowMessage(DateTimeToStr(Date));

    //Use FormatDateTime with Format string
    ShowMessage(FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz' , Date));
end;

<强>数据库

您的dbexpress标记表明您正在尝试将datetime存储在数据库中。我不知道dbexpress但是ADO会截断datetime之外的毫秒数。 To save with milliseconds in SQL Server with ADO你必须自己构建insert语句。它与dbexpress可能相同。

以下是一些ADO代码,它将在SQL Server中保存datetime毫秒(

ADOCommand1.CommandText := 'insert into DateTbl values ('''+
    FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz' , Date)+''')';
ADOCommand1.Execute;

SQL Server中datetime的精度3.33毫秒。这与Delphi中的不同,因此当我保存2011-02-28 20:43:10.012时,它在SQL Server中保存为2011-02-28 20:43:10.013。这对你来说可能是一个问题。

您可以将一个datetime的毫秒部分存储在单独的整数列中。这样,您将始终存储您在Delphi中编码的相同值,并且您不必构建自己的insert语句。

<强>的dbExpress

我已经使用DBX组件进行了一些测试,它们也截断了毫秒数。

答案 1 :(得分:2)

使用此格式HH:MM:SS.ZZZ

干杯

答案 2 :(得分:2)

对您来说可能并不明显,但在默认的日期和时间格式中,秒和毫秒通常用点(.)分隔。您在问题Apr 10 2008 7:21:31:460PM中显示的示例字符串在该位置有一个冒号(:)。这很可能导致毫秒被删除。