HelpF.pro

Как строку вида 2023-07-24T15:35:34+03:00 (формат ISO 8601) преобразовать в дату?

Стандарт ISO 8601, составлен таким образом, что:

  • Строка даты-времени сплошная без пробельных разделителей
  • Латинские символы используются в качестве разделителей/идентификаторов: D - дни, Y - годы, Z - идентификатор UTC и т.д., например можно задать промежуток времени: P4Y3M2D1H - 4 года, 3 месяца, 2 дня и 1 час.
  • Буква T выбрана в качестве уникального разделителя времени, остальные буквы латинского алфавита (почти все) задействованы под разные цели и они не пересекаются. Соответственно упрощается парсинг ISO-8601 строки: имеется заранее известный набор флагов/символов/маркеров, опираясь на которые, можно достаточно быстро разбить строку на нужные составляющие и при этом сохраняется требование к human readability самой строки.

Конвертация даты из формата ISO8601 в дату 1С:

Код 1C v 8.3
 //Простой пример
Дата1С = XMLЗначение(Тип("Дата"), "2023-07-24T15:35:34+03:00");

// еще Функция Возвращает структуру с полями "Дата" и "Миллисекунды", стандартный способ преобразования даты округляет время, а в некоторых случаях важна особая точность
Функция КонвертироватьДатуISO8601ВДату(Дата) Экспорт
КонвертированнаяДата = Новый Структура("Дата, Миллисекунды");
АвтоконвертированнаяДата = XMLЗначение(Тип("Дата"), Дата);

Миллисекунды = Сред(Дата, 21);
Миллисекунды = СокрЛП(СтрЗаменить(Миллисекунды, "Z", ""));

Если НЕ ПустаяСтрока(Миллисекунды) Тогда

ЧислоМиллисекунд = Число(Миллисекунды);

Если ЧислоМиллисекунд >= 500 Тогда

АвтоконвертированнаяДата = АвтоконвертированнаяДата - 1;

КонецЕсли;

КонецЕсли;

КонвертированнаяДата.Дата = АвтоконвертированнаяДата;

КонвертированнаяДата.Миллисекунды = Миллисекунды;

Возврат КонвертированнаяДата;
КонецФункци

Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq/view/1926.html