XMLTimeToDateTime忽略毫秒

时间:2011-11-11 12:04:21

标签: xml delphi datetime

为什么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。

1 个答案:

答案 0 :(得分:8)

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!