1С 8.3 Преобразование строки в дату (+типовая функция)
Данные > Примеры кода 1С > 1С 8.3 Дата и время
Перейти в основной раздел:
Типовая экспортная функция преобразования строки в дату в 1С 8.3:
Функция СтрокаВДату(Знач ДатаСтрока)
ПозицияПробела = СтрНайти(ДатаСтрока, " ", НаправлениеПоиска.СНачала);
Если ПозицияПробела > 0 Тогда
ДатаСтрока = Лев(ДатаСтрока, ПозицияПробела - 1);
КонецЕсли;
ДатаСтрока = СокрЛП(СтрЗаменить(ДатаСтрока, ".", ""));
ДатаСтрока = Сред(ДатаСтрока, 5) + Сред(ДатаСтрока, 3, 2) + Лев(ДатаСтрока, 2);
Если СтрДлина(ДатаСтрока) = 6 Тогда
ДатаСтрока = "20" + ДатаСтрока;
КонецЕсли;
ОписаниеТипа = Новый ОписаниеТипов("Дата");
Результат = ОписаниеТипа.ПривестиЗначение(ДатаСтрока);
Возврат Результат;
КонецФункции
ПозицияПробела = СтрНайти(ДатаСтрока, " ", НаправлениеПоиска.СНачала);
Если ПозицияПробела > 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 - год полностью
// 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 Тогда
ПреобразованнаяДата = УниверсальноеВремя(ПреобразованнаяДата, ПришедшийЧП);
КонецЕсли;
ПреобразованнаяДата = МестноеВремя(ПреобразованнаяДата, ТекущийЧП);
Исключение
КонецПопытки;
КонецЕсли;
Возврат ПреобразованнаяДата;
КонецФункции
Если ТипЗнч(СтрокаДаты) = Тип("Дата") Тогда
Возврат СтрокаДаты;
ИначеЕсли ТипЗнч(СтрокаДаты) <> Тип("Строка") Или ПустаяСтрока(СтрокаДаты) Тогда
Возврат Дата(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;
Попытка
Возврат Дата(ДатаВСтроке);
Исключение
Возврат ОписаниеОшибки();
КонецПопытки;
КонецФункции
ШаблонДопСимволов = "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КДате(СтрокаДата);
КонецПроцедуры
ПеремДата = 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
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник