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!