2011-11-11 9 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); 

'2011-11-11T11:41:36.000' =そのT2後

私は、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は実際には日付を2回解析します。最初に、日付/時刻を解析し、結果を投げ捨てて元の文字列のみを保存し、TXSCustomDateTime.GetAsUTCDateTimeがこの文字列を再度解析するTXSDateTime.XSToNativeが呼び出されます。ユー!

関連する問題