2

当我们使用 EncodeTime 函数 EncodeTime(wHour, wMinute, wSecond, wMilliseconds) 时,它不会将毫秒值分配给结果。

我们在下面使用对日期和时间进行编码

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值而不包含毫秒值。

请让我们知道是否有格式化值并将其与毫秒一起存储在变量中。 * ** * ** * ** * ** * ** * ***我正在尝试的功能* ** * ** * ** * ***

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;

有任何想法吗?

4

3 回答 3

6

我可能误解了这里的问题,但也许它正在被存储但你没有看到它。调试器不显示毫秒,也不显示DateTimeToStrFormatDateTime使用格式字符串可以。

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. 要使用 ADO 在 SQL Server 中以毫秒为单位保存,您必须自己构建插入语句。它可能与 dbexpress 相同。

这是一些将datetime在 SQL Server 中保存毫秒的ADO 代码

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

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

一种解决方案可能是将 a 的毫秒部分存储datetime在单独的整数列中。这样,您将始终存储在 Delphi 中编码的相同值,而不必构建自己的插入语句。

DBExpress

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

于 2011-02-28T20:48:19.057 回答
2

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

于 2011-02-28T18:37:42.167 回答
2

使用这种格式 HH:MM:SS.ZZZ

干杯

于 2011-02-28T18:12:37.297 回答