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