当我们使用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;
有什么想法吗?
答案 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
中显示的示例字符串在该位置有一个冒号(:
)。这很可能导致毫秒被删除。