Один сервис возвращает DateTime stamp в виде 13-значного целого числа (например, 1723107180737). Очень похоже на количество миллисекунд, прошедших с 01.01.1970. По карйней мере, если отбросить три последние цифры и вызвать UnixToDateTime, то получим что-то очень похожее на правду (08.08.2024 08:53:00). Правда, скорее всего, это по Гринвичу, так как в Москве было уже 11:53. Законный ли это способ, или есть что-то другое, работающее именно с таким числом?
Ну и второй вопрос. Заказчик хочет это получить в виде
2024-08-08T11:53:00+03:00
Это какой-то предопределённый формат или как? Допустим, расположить циферки и значки в нужном порядке я смогу (хотя бы через DateTimeToString), но вот что делать с часовым поясом? Всё руками: получать его из настроек компа, потом добавить ко времени смещение и сформировать строку с результатом? Или всё же это что-то стандартное и уже написано?
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
В общем, про формат я нашёл. Называется он ISO8601. И в последних версиях Delphi даже есть функция DateToISO8601.
Про DateTimeStamp. представленном как количество миллисекунд с 1 января 1970 года ничего не нашёл. Учитывая это, а также то, что XE3 поддержки ещё нет, под свои нужды написал следующую функцию (доработка напильником стандартной DateToISO8601).
function UnixDateTimeToISO8601(ADateTimeStamp: Int64): String;
const
Signs: array[Boolean] of String = ('+', '-');
var
TimeZone: TTimeZone;
DateTime: TDateTime;
y, mo, d, h, mi, se, ms: Word;
Bias: Integer;
FormatStr: String;
begin
TimeZone := TTimeZone.Local;
DateTime := TimeZone.ToLocalTime(UnixToDateTime(ADateTimeStamp div 1000));
Bias := Trunc(TimeZone.GetUtcOffset(DateTime).Negate.TotalMinutes);
DecodeDate(DateTime, y, mo, d);
DecodeTime(DateTime, h, mi, se, ms);
Result := Format('%.4d-%.2d-%.2dT%.2d:%.2d:%.2d', [y, mo, d, h, mi, se]);
Result := Result + Format('%s%.2d:%.2d', [Signs[Bias > 0], Abs(Bias) div MinsPerHour, Abs(Bias) mod MinsPerHour]);
end;
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.