Как строку вида 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;
КонецЕсли;
КонецЕсли;
КонвертированнаяДата.Дата = АвтоконвертированнаяДата;
КонвертированнаяДата.Миллисекунды = Миллисекунды;
Возврат КонвертированнаяДата;
КонецФункци
Категория:
Работа с Датами (Временем) Как получить текущее время с милисекундами? В Платформе 8.2.17 реализована возможность получения числа миллисекунд, прошедших с 1 января 0001 года, 0:00:00 UTC с помощью функции
Код 1C v 8.2 УП ТекущаяУниверсальнаяДатаВМиллисекундах()
Код 1C v 8.х // В 8.х переменные типа "дата" содержат миллисекунды , только это нигде не написано
ДатаИсх = ТекущаяДата(); //простая дата+время
ДатаНов = ДатаИсх + 0.567; //дата+время+миллисекунды
Миллисекунды = (ДатаНов - ДатаИсх) * 1000; //вытаскиваем миллисекунды из даты
Код 1C v 8.х Функция ПолучитьТекущееВремяВМиллисекундах() Экспорт
Если JavaScript = Неопределено Тогда
Попытка
JavaScript = Новый COMОбъект("MSScriptControl.ScriptControl");
Исключение
Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат 0;
КонецПопытки;
JavaScript.Language = "javascript";
КонецЕсли;
Время = JavaScript.Eval("new Date().getTime()");
Возврат Время;
КонецФункции
Код 1C v 8.х // Как быстрее получить время в миллисекундах?
Locator = Новый COMОбъект("WbemScripting.SWbemLocator");
ServicesSet = Locator.ConnectServer(".");
Для а=1 по 100 цикл
pEnum = ServicesSet.InstancesOf("Win32_OperatingSystem");
Для каждого Object Из pEnum Цикл
сообщить(сред(Object.LocalDateTime,13,6));
Прервать;
КонецЦикла;
КонецЦикла;
Код 1C v 7.x
Scr=СоздатьОбъект("MSScriptControl.ScriptControl");
Scr.Language = "javascript";
d=Scr.Eval("new Date();");
Сообщить(d.getTime(0));
Сообщить(d.getHours(0));
Сообщить(d.getMinutes(0));
Сообщить(d.getSeconds(0));
Сообщить(d.getMilliseconds(0));
Категория:
Работа с Датами (Временем)