1С 8.3 Преобразование строки в дату (+типовая функция) - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

1С 8.3 Преобразование строки в дату (+типовая функция)

Данные > Примеры кода 1С > 1С 8.3 Дата и время
Типовая экспортная функция преобразования строки в дату в 1С 8.3:
Функция СтрокаВДату(Знач ДатаСтрока)

   ПозицияПробела = СтрНайти(ДатаСтрока, " ", НаправлениеПоиска.СНачала);
   Если ПозицияПробела > 0 Тогда
       ДатаСтрока = Лев(ДатаСтрока, ПозицияПробела - 1);
   КонецЕсли;
   ДатаСтрока = СокрЛП(СтрЗаменить(ДатаСтрока, ".", ""));
   ДатаСтрока = Сред(ДатаСтрока, 5) + Сред(ДатаСтрока, 3, 2) + Лев(ДатаСтрока, 2);
   Если СтрДлина(ДатаСтрока) = 6 Тогда
       ДатаСтрока = "20" + ДатаСтрока;
   КонецЕсли;

   ОписаниеТипа = Новый ОписаниеТипов("Дата");
   Результат    = ОписаниеТипа.ПривестиЗначение(ДатаСтрока);

   Возврат Результат;

КонецФункции
Улучшенный аналог СтрокаВДату() от UHоldеr в 1С 8.3:
//Преобразование строки в дату/время с указанием строки форматирования.
//При ошибке преобразования генерируется исключение.
//Допустимые значения в строке форматирования:
//    yyyy     - год полностью
//    yy        - год сокращённо
//    mm        - месяц
//    dd        - день
//    hh        - часы
//    nn        - минуты
//    ss        - секунды
//    Разделитель в исходной строке и строке форматирования может различаться.
//
// Параметры:
//  ДатаСтрока    - Строка - Исходная строка с датой
//  ФорматДаты    - Строка - Формат даты в переданной строке
//
// Возвращаемое значение:
//   Дата
//
// Пример:
// СтрокаВДатуВремя("02.06.22", "dd.mm.yy")
// СтрокаВДатуВремя("02.06.22 12:30:00, "dd.mm.yy hh:nn:ss")
// СтрокаВДатуВремя("02/06/22 12:30:00, "dd.mm.yy hh:nn:ss")
Функция СтрокаВДатуВремя(ДатаСтрока, ФорматДаты = "dd.mm.yyyy") Экспорт

   Если ЗначениеЗаполнено(ДатаСтрока) Тогда
       Попытка
           Годы = СтрНайти(ФорматДаты, "yyyy");
           Годы = ?(Годы = 0 , 0, Число(Сред(ДатаСтрока, Годы, 4)));
           Если Годы = 0 Тогда
               Годы = СтрНайти(ФорматДаты, "yy");
               Годы = ?(Годы = 0 , 0, Число("20" + Сред(ДатаСтрока, Годы, 2)));
           КонецЕсли;
           Месяцы     = СтрНайти(ФорматДаты, "mm");
           Дни     = СтрНайти(ФорматДаты, "dd");
           Часы     = СтрНайти(ФорматДаты, "hh");
           Минуты     = СтрНайти(ФорматДаты, "nn");
           Секунды = СтрНайти(ФорматДаты, "ss");

           Возврат Дата(
               ?(Годы         = 0, 1, Годы),
               ?(Месяцы     = 0, 1, Число(Сред(ДатаСтрока, Месяцы, 2))),
               ?(Дни         = 0, 1, Число(Сред(ДатаСтрока, Дни, 2))),
               ?(Часы         = 0, 0, Число(Сред(ДатаСтрока, Часы, 2))),
               ?(Минуты     = 0, 0, Число(Сред(ДатаСтрока, Минуты, 2))),
               ?(Секунды     = 0, 0, Число(Сред(ДатаСтрока, Секунды, 2)))
           )
       Исключение
           ВызватьИсключение "Ошибка преобразования строки """ + ДатаСтрока + """ в дату по формату """ + ФорматДаты + """"
       КонецПопытки;
   Иначе
       Возврат Неопределено
   КонецЕсли;

КонецФункции // СтрокаВДатуВремя
Улучшенный аналог СтрокаВДату() от подписчика в 1С 8.3:
Функция ПреобразоватьСтрокуКДате(Знач СтрокаДаты) Экспорт

   Если ТипЗнч(СтрокаДаты) = Тип("Дата") Тогда
       Возврат СтрокаДаты;
   ИначеЕсли ТипЗнч(СтрокаДаты) <> Тип("Строка") Или ПустаяСтрока(СтрокаДаты) Тогда
       Возврат Дата(1,1,1);
   КонецЕсли;

   СтрокаДаты = ВРег(СтрокаДаты);
   НеобходимоПриводитьКМестномуВремени = Ложь;
   СимволРазделенияДаты = СтрНайти(СтрокаДаты, "T", НаправлениеПоиска.СКонца);
   Если СимволРазделенияДаты = 0 Тогда
       СимволРазделенияДаты = СтрНайти(СтрокаДаты, " ", НаправлениеПоиска.СКонца);
   КонецЕсли;

   СмещениеЧасы = 0;
   СмещениеМинуты = 0;
   ВремяМеньшеUTC = Ложь;

   Если СтрНайти(СтрокаДаты, "Z") > 0 Тогда
       НеобходимоПриводитьКМестномуВремени = Истина;
       СтрокаДаты = СтрЗаменить(СтрокаДаты, "Z", ".");
   ИначеЕсли СимволРазделенияДаты > 0 Тогда
       СимволЧП = СтрНайти(СтрокаДаты, "-",, СимволРазделенияДаты);
       Если СимволЧП = 0 Или СимволЧП <= СимволРазделенияДаты Тогда
           СимволЧП = СтрНайти(СтрокаДаты, "+",, СимволРазделенияДаты);
       Иначе
           ВремяМеньшеUTC = Истина;
       КонецЕсли;
       Если СимволЧП <> 0 И СимволЧП > СимволРазделенияДаты Тогда
           НеобходимоПриводитьКМестномуВремени = Истина;
           ЧастьЧП = Сред(СтрокаДаты, СимволЧП + 1);
           мЧастейДаты = СтрРазделить(ЧастьЧП, ":");
           Попытка
               СмещениеЧасы = ?(мЧастейДаты.Количество() > 0, Число(мЧастейДаты[0]), 0);
               СмещениеМинуты = ?(мЧастейДаты.Количество() > 1, Число(мЧастейДаты[1]), 0);
           Исключение
           КонецПопытки;
           СтрокаДаты = Лев(СтрокаДаты, СимволЧП - 1);
       КонецЕсли;
   КонецЕсли;

   // Приведем к одному разделителю
   СтрокаДаты = СтрЗаменить(СтрокаДаты, "-", ".");
   СтрокаДаты = СтрЗаменить(СтрокаДаты, "+", ".");
   СтрокаДаты = СтрЗаменить(СтрокаДаты, "/", ".");
   СтрокаДаты = СтрЗаменить(СтрокаДаты, "\", ".");
   СтрокаДаты = СтрЗаменить(СтрокаДаты, "T", ".");
   СтрокаДаты = СтрЗаменить(СтрокаДаты, "Т", ".");
   СтрокаДаты = СтрЗаменить(СтрокаДаты, ":", ".");
   СтрокаДаты = СтрЗаменить(СтрокаДаты, ";", ".");
   СтрокаДаты = СтрЗаменить(СтрокаДаты, ",", ".");
   СтрокаДаты = СтрЗаменить(СтрокаДаты, " ", ".");

   ПреобразованнаяДата = Дата(1,1,1);
   Год = 1;
   Месяц = 1;
   День = 1;
   Час = 0;
   Минута = 0;
   Секунда = 0;

   мЧастейДаты = СтрРазделить(СтрокаДаты, ".", Ложь);
   Если мЧастейДаты.Количество() = 1 Тогда
       Попытка
           ПреобразованнаяДата = Дата(мЧастейДаты[0]);
       Исключение
           ПреобразованнаяДата = Дата(1,1,1);
       КонецПопытки;
       Возврат ПреобразованнаяДата;
   ИначеЕсли мЧастейДаты.Количество() >= 3 Тогда
       Попытка
           Месяц = Число(мЧастейДаты[1]);
           Если СтрДлина(мЧастейДаты[0]) = 4 Тогда
               Год = Число(мЧастейДаты[0]);
               День = Число(мЧастейДаты[2]);
           ИначеЕсли СтрДлина(мЧастейДаты[2]) = 4 Тогда
               Год = Число(мЧастейДаты[2]);
               День = Число(мЧастейДаты[0]);
           Иначе
               Год = Число(?(мЧастейДаты[2] >= 50, Цел(Год(ТекущаяДата()) / 100) - 1,
               Цел(Год(ТекущаяДата()) / 100)) + мЧастейДаты[2]);
               День = Число(мЧастейДаты[0]);
           КонецЕсли;
           Час = ?(мЧастейДаты.Количество() > 3, Число(мЧастейДаты[3]), 0);
           Минута = ?(мЧастейДаты.Количество() > 4, Число(мЧастейДаты[4]), 0);
           Секунда = ?(мЧастейДаты.Количество() > 5, Число(мЧастейДаты[5]), 0);
       Исключение
           Возврат ПреобразованнаяДата;
       КонецПопытки;
   Иначе
       Возврат ПреобразованнаяДата;
   КонецЕсли;

   Попытка
       ПреобразованнаяДата = Дата(Год, Месяц, День, Час, Минута, Секунда);
   Исключение
       ПреобразованнаяДата = Дата(1,1,1);
   КонецПопытки;

   Если Не ПреобразованнаяДата = Дата(1,1,1) И НеобходимоПриводитьКМестномуВремени Тогда
       ТекущееСмещениеСек = СмещениеСтандартногоВремени();
       ТекСмещениеЧас = Цел(ТекущееСмещениеСек / 3600);
       ТекСмещениеМин = Цел((ТекущееСмещениеСек - ТекСмещениеЧас * 3600) / 60);
       ТекСмещениеМин = ?(ТекСмещениеМин < 0, -1 * ТекСмещениеМин, ТекСмещениеМин);

       ТекущийЧП = СтрШаблон("GMT%1%2:%3", ?(ТекСмещениеЧас >= 0, "+", ""),
       Формат(ТекСмещениеЧас, "ЧЦ=2; ЧДЦ=0; ЧН=00; ЧВН=; ЧГ=0"),
       Формат(ТекСмещениеМин, "ЧЦ=2; ЧДЦ=0; ЧН=00; ЧВН=; ЧГ=0"));
       ПришедшийЧП = СтрШаблон("GMT%1%2:%3", ?(ВремяМеньшеUTC, "-", "+"),
       Формат(СмещениеЧасы, "ЧЦ=2; ЧДЦ=0; ЧН=00; ЧВН=; ЧГ=0"),
       Формат(СмещениеМинуты, "ЧЦ=2; ЧДЦ=0; ЧН=00; ЧВН=; ЧГ=0"));
       Если ТекущийЧП = ПришедшийЧП Тогда
           Возврат ПреобразованнаяДата;
       КонецЕсли;

       Попытка
           Если СмещениеЧасы <> 0 Или СмещениеМинуты <> 0 Тогда
               ПреобразованнаяДата = УниверсальноеВремя(ПреобразованнаяДата, ПришедшийЧП);
           КонецЕсли;
           ПреобразованнаяДата = МестноеВремя(ПреобразованнаяДата, ТекущийЧП);
       Исключение
       КонецПопытки;
   КонецЕсли;

   Возврат ПреобразованнаяДата;

КонецФункции
Улучшенный аналог СтрокаВДату() от Timo в 1С 8.3:
Функция СтрокуВДату(Строка, Формат) Экспорт

   ШаблонДопСимволов = "ymdhns";

   СтруктураДаты = Новый Структура;
   СтруктураДаты.Вставить("yy","");
   СтруктураДаты.Вставить("mm","");
   СтруктураДаты.Вставить("dd","");
   СтруктураДаты.Вставить("hh","");
   СтруктураДаты.Вставить("nn","");
   СтруктураДаты.Вставить("ss","");

   ДлинаФормата = СтрДлина(Формат);
   Символ = 1;
   Пока Символ <= ДлинаФормата Цикл
       ТекущийШаблон = Сред(Формат,Символ,1);
       ТекущийСимвол = Сред(Строка,Символ,1);
       ПредпологаемыйШаблон = ТекущийШаблон + ТекущийШаблон;
       Если СтрНайти(ШаблонДопСимволов,ТекущийШаблон) >= 1 И СтруктураДаты.Свойство(ПредпологаемыйШаблон) Тогда
           СтруктураДаты[ПредпологаемыйШаблон] = СтруктураДаты[ПредпологаемыйШаблон] + ТекущийСимвол;
       КонецЕсли;
       Символ = Символ + 1;
   КонецЦикла;
   Если СтрДлина(СтруктураДаты.yy)= 2 Тогда
       СтруктураДаты.yy = "20" + СтруктураДаты.yy;
   КонецЕсли;

   ДатаВСтроке = СтруктураДаты.yy + СтруктураДаты.mm + СтруктураДаты.dd
   + СтруктураДаты.hh + СтруктураДаты.nn + СтруктураДаты.ss;

   Попытка
       Возврат Дата(ДатаВСтроке);
   Исключение
       Возврат ОписаниеОшибки();
   КонецПопытки;

КонецФункции
Преобразование формата ISO 8601 в Дату в 1С 8.3:
Функция ПреобразоватьДатаISO8601КДате(СтрокаДата) Экспорт

   ПеремДата = XMLЗначение(Тип("Дата"), СтрокаДата); // 13.03.2024 20:48:52

   ПреобразованнаяДата = ЗаписатьДатуJSON(ПеремДата,
   ФорматДатыJSON.ISO,
   ВариантЗаписиДатыJSON.ЛокальнаяДатаСоСмещением);

   Возврат ПреобразованнаяДата; // 2024-03-13T20:48:52+03:00

КонецФункции

Процедура Пример()

   СтрокаДата = "2024-03-13T20:48:52+03:00";
   ПреобразоватьДатаISO8601КДате(СтрокаДата);

КонецПроцедуры
0
комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 02.06.2022
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому