powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка конвертирования даты и времени ISO8601ToDate()
4 сообщений из 4, страница 1 из 1
Ошибка конвертирования даты и времени ISO8601ToDate()
    #40058762
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обрабатываю XML, где есть теги с датами и временем

Код: plaintext
1.
2.
3.
2021-03-19T04:03:58+03:00
2021-03-28T03:03:58+03:00
2021-03-28T03:03:34+03:00
2021-03-28T03:03:56+03:00
для примера выше указал несколько строк, где первая строка не проблемная, а остальные - проблемные, т.е. в некоторых случаях вываливается exception.

Project raised exception class ELocalTimeInvalid with message 'The given "28.03.2021 3:03:58" local time is invalid (situated within the missing period prior to DST).'.


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TImport.SetDt(const sVal: string; MemData: TdxMemData; sFieldName: string);
Var
 d: TDateTime;
begin
  try
    d := System.DateUtils.ISO8601ToDate(Trim(sVal), False);
    MemData.FieldByName(sFieldName).AsDateTime := d;
  except
    on e:exception do begin
      ShowMessage('Ошибка конвертирования даты и времени, ID=' + fIdOffer.ToString + sLineBreak + e.Message);
    end;
  end;
end;


ЧЯДНТ?
Delphi 10.4.2
...
Рейтинг: 0 / 0
Ошибка конвертирования даты и времени ISO8601ToDate()
    #40058767
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так подразумеваю, что в это время перевод часов был?
...
Рейтинг: 0 / 0
Ошибка конвертирования даты и времени ISO8601ToDate()
    #40058788
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Я так подразумеваю, что в это время перевод часов был?
Именно так. Похоже на баг Эмбаркадеры
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
function AdjustDateTime(const ADate: TDateTime; AHourOffset, AMinuteOffset:Integer; IsUTC: Boolean = True): TDateTime;
var
  AdjustDT: TDateTime;
  BiasLocal: Int64;
  BiasTime: Integer;
  BiasHour: Integer;
  BiasMins: Integer;
  BiasDT: TDateTime;
  TZ: TTimeZone;
begin
  Result := ADate;
  if IsUTC then
    .......
  else
  begin
    { Now adjust TDateTime based on any offsets we have and the local bias }
    { There are two possibilities:
        a. The time we have has the same offset as the local bias - nothing to do!!
        b. The time we have and the local bias are different - requiring adjustments }
    TZ := TTimeZone.Local;
    BiasLocal := Trunc(TZ.GetUTCOffset(Result).Negate.TotalMinutes);
    BiasTime  := (AHourOffset * MinsPerHour) + AMinuteOffset;
    if (BiasLocal + BiasTime) = 0 then
      Exit;

    { Here we adjust the Local Bias to make it relative to the Time's own offset
      instead of being relative to GMT }
    BiasLocal := BiasLocal + BiasTime;
    BiasHour := Abs(BiasLocal) div MinsPerHour;
    BiasMins := Abs(BiasLocal) mod MinsPerHour;
    BiasDT := EncodeTime(BiasHour, BiasMins, 0, 0);
    if (BiasLocal > 0) then
      Result := Result - BiasDT
    else
      Result := Result + BiasDT;
  end;
end;

Т.е. они вместо того, чтобы декодированное время сместить в UTC, а потом переместить в текущий часовой пояс, вычисляют смещение указанного времени для текущего часового пояса, а потом смещают на разницу между часовым поясом и смещением, указанном в строке. А т.к времени 2021-03-28T03:03:58 в киевском часовом поясе не существует, то отсюда и исключение
...
Рейтинг: 0 / 0
Ошибка конвертирования даты и времени ISO8601ToDate()
    #40058801
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По мне, так это заведомо ошибка - перегонять дату+часовой пояс в просто дату. Либо надо это делать через utc, что железно сработает, либо вообще не делать.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка конвертирования даты и времени ISO8601ToDate()
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]