XMLTimeToDateTime игнорирует миллисекунды - PullRequest
8 голосов
/ 11 ноября 2011

почему 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 Ответ

8 голосов
/ 11 ноября 2011

Код в 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.

Весь синтаксический анализ и хранение данных выполняются во внутренних (часть реализации) классах, к которым нельзя получить прямой доступ, кроме как через(сломанные) обертки.Итак, вы должны написать свой собственный анализатор даты / времени.


В дополнение ко всему уродству, обнаруженному в XSBuiltIns, XMLTimeToDateTime фактически анализирует дату дважды.Сначала вызывается TXSDateTime.XSToNative, который анализирует дату / время, выбрасывает результат и сохраняет только исходную строку, а затем TXSCustomDateTime.GetAsUTCDateTime снова анализирует эту строку.Euch!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...