При работе с временными метками, полученными через GitHub API в формате UTC, важно корректно их конвертировать в локальное время. Вопрос, заданный пользователем, касается именно этой проблемы: временные метки, полученные в формате UTC, некорректно конвертируются в локальное время (EST) с помощью функций LocalDateTimeFromUTCDateTime и UnivDateTime2LocalDateTime, которые вместо добавления 4 часов (разницы между UTC и EST) вместо этого вычитают 4 часа.
Анализ проблемы
Пользователь использует функцию XSToNative из компонента TXSDateTime для конвертации строки временной метки из формата UTC в TDateTime. После этого, он пытается конвертировать полученное значение в локальное время, используя функции LocalDateTimeFromUTCDateTime и UnivDateTime2LocalDateTime, но результаты оказываются неверными.
Подтвержденное решение
В редакции вопроса пользователь обнаружил, что функция, которую он использовал изначально, производила двойной сдвиг времени, что приводило к ошибке. Также упоминается функция ISOToDateTime из модуля System.DateUtils, которая может быть использована для конвертации ISO временных меток в TDateTime.
Для корректной конвертации временных меток из UTC в локальное время в Delphi, предлагается использовать следующие функции:
Конвертация ISO временной метки в TDateTime:
function ISOToDateTime(const AISODateTime: string): TDateTime;
var
I: Integer;
VDate, VTime: TDateTime;
VFormatSettings: TFormatSettings;
begin
// ISO формат: 2009-07-06T01:53:23Z
VFormatSettings.DateSeparator := '-';
VFormatSettings.ShortDateFormat := 'yyyy-mm-dd';
VFormatSettings.TimeSeparator := ':';
VFormatSettings.ShortTimeFormat := 'hh:nn:ss';
I := Pos('T', AISODateTime);
VDate := StrToDate(Copy(AISODateTime, 1, I - 1), VFormatSettings);
VTime := StrToTime(Copy(AISODateTime, I + 1, 8), VFormatSettings);
Result := Trunc(VDate) + Frac(VTime);
end;
Конвертация времени из UTC в локальное время:
function UniversalToLocalTime(const AUtcTime: TDateTime): TDateTime;
// код функции, описание которого предполагает сложные операции с системным часовым поясом
// здесь используется внутренняя функция _GetSystemTzOffset для получения смещения часового пояса
// затем смещение применяется к AUtcTime для получения локального времени
end;
Альтернативное решение
В качестве альтернативного решения, можно использовать функцию DateTime2UnivDateTime, которая, по словам пользователя, дает корректный результат. Однако, стоит проверить ее на предмет совместимости с вашей системой и версией Delphi, так как она может быть не предназначена для использования в стандартных операциях конвертации времени.
Заключение
Пользователю необходимо быть внимательным при выборе функций для конвертации временных меток. Важно понимать, что ошибки в коде, связанные с часовыми поясами, могут быть сложными для отладки. Использование проверенных и рекомендованных библиотек, таких как System.DateUtils, может помочь избежать подобных проблем.
Пользователь сталкивается с проблемой некорректной конвертации временных меток из UTC в локальное время в среде разработки Delphi, используя функции `LocalDateTimeFromUTCDateTime` и `UnivDateTime2LocalDateTime`, которые неправильно об
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS