2011-11-11 33 views
8

爲什麼XMLTimeToDateTime忽略毫秒?XMLTimeToDateTime忽略毫秒

Test := XMLTimeToDateTime('2011-11-11T12:41:36.696+01:00', TRUE); 
    T2 := FormatDateTime('yyyy''-''mm''-''dd''T''hh'':''nn'':''ss''.''zzz', Test); 

即T2之後= '2011-11-11T11:41:36.000'

我使用的Delphi 2007

回答

7

在XSBuiltIns代碼的確解析毫秒部分,但該部分是從未用於編碼功能。

function TXSBaseTime.GetAsTime: TDateTime; 
begin 
    Result := EncodeTime(Hour, Minute, Second, 0); 
end; 

function TXSBaseCustomDateTime.GetAsDateTime: TDateTime; 
var 
    BiasDT: TDateTime; 
    BiasTime, BiasLocal: Integer; 
    BiasHour, BiasMins: Word; 
begin 
    { NOTE: In XML Years can exceed 9999 - that's not the case for TDateTime. 
      So here, there would be a problem with the conversion } 
    Result := EncodeDateTime(Year, Month, Day, Hour, Minute, Second, 0); 

function TXSBaseCustomDateTime.GetAsUTCDateTime: TDateTime; 
var 
    AdjustDT: TDateTime; 
begin 
    Result := EncodeDateTime(Year, Month, Day, Hour, Minute, Second, 0); 

作爲最後一個被從XMLTimeToDateTime叫,這是完全可以理解的毫秒部分總是0

所有解析並且數據存儲在內部(實現部分)類中完成,這些類不能直接訪問除了通過(破損)包裝。 IOW,你應該寫你自己的日期/時間解析器。


除了在XSBuiltIns中發現的所有醜陋之外,XMLTimeToDateTime實際上還會對日期進行兩次解析。首先調用TXSDateTime.XSToNative,它解析日期/時間,拋出結果並僅存儲原始字符串,然後TXSCustomDateTime.GetAsUTCDateTime再次解析該字符串。 Euch!