2011-11-11 11 views
8

perché XMLTimeToDateTime ignora i millisecondi?XMLTimeToDateTime ignora i millisecondi

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

dopo che T2 = '2011-11-11T11: 41: 36.000'

Sto usando Delphi 2007.

risposta

7

Il codice in XSBuiltIns analizza infatti la parte millisecondo, ma questa parte è mai usato nelle funzioni di codifica.

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

e

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); 

e

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

Come l'ultimo è chiamato da XMLTimeToDateTime, è del tutto comprensibile che la parte millisecondo è sempre 0.

Tutti parsing e l'archiviazione dei dati avviene in classi interne (parte di implementazione) a cui non è possibile accedere direttamente tranne attraverso gli involucri (rotti). IOW, dovresti scrivere il tuo parser data/ora.


In aggiunta a tutte le brutture si trovano in XSBuiltIns, XMLTimeToDateTime in realtà analizza data due volte. Prima viene chiamato TXSDateTime.XSToNative che analizza la data/ora, genera il risultato e memorizza solo la stringa originale, quindi TXSCustomDateTime.GetAsUTCDateTime analizza nuovamente questa stringa. Euch!