Строка дату. Преобразует исходную строку в дату.
// Преобразует исходную строку в дату.
// Если дату не удалось распознать, то возвращается пустая дата (01.01.01 00:00:00).
//
// Параметры:
// Значение - Строка - строка, которую необходимо привести к дате.
// Формат даты должен быть в виде "ДД.ММ.ГГГГ" или "ДД/ММ/ГГ" или "ДД-ММ-ГГ ЧЧ:ММ:CC",
// Например, "23.02.1980" или "23/02/80 09:15:45".
// ЧастьДаты - ЧастиДаты - Определяет допустимые части даты. По умолчанию, ЧастиДаты.Дата.
//
// Возвращаемое значение:
// Дата - полученная дата.
//
Функция СтрокаВДату(Знач Значение, ЧастьДаты = Неопределено) Экспорт
НаборЦифр = "1234567890";
Если ТипЗнч(ЧастьДаты) <> Тип("ЧастиДаты") Тогда
ЧастьДаты = ЧастиДаты.Дата;
КонецЕсли;
ПараметрыДаты = Новый КвалификаторыДаты(ЧастьДаты);
ОписаниеТипаДата = Новый ОписаниеТипов("Дата",,, ПараметрыДаты);
Значение = ВРег(СтрСоединить(СтрРазделить(СокрЛП(Значение), Символы.НПП + Символы.ПС + Символы.Таб), " "));
Результат = ОписаниеТипаДата.ПривестиЗначение(Значение);
Для НомерМесяца = 1 По 12 Цикл
Значение = СтрЗаменить(Значение, ВРег(Формат(Дата(1, НомерМесяца, 2), "ДФ=MMММ")), Формат(НомерМесяца, "ЧЦ=2; ЧВН="));
Значение = СтрЗаменить(Значение, ВРег(Формат(Дата(1, НомерМесяца, 2), "ДФ=MMM")), Формат(НомерМесяца, "ЧЦ=2; ЧВН="));
КонецЦикла;
МассивНеЦифр = СтрРазделить(Значение, НаборЦифр);
Если МассивНеЦифр.Количество() < 2 Тогда
Возврат Результат;
КонецЕсли;
ПозицияПервойЦифры = СтрДлина(МассивНеЦифр[0]);
ПозицияПоследнейЦифры = СтрДлина(Значение) - СтрДлина(МассивНеЦифр[МассивНеЦифр.ВГраница()]);
Значение = Сред(Значение, ПозицияПервойЦифры, ПозицияПоследнейЦифры - ПозицияПервойЦифры);
Если ПустаяСтрока(Значение) Тогда
Возврат Результат;
КонецЕсли;
ЗначениеМассивом = СтрРазделить(Значение, " ");
Элемент = ЗначениеМассивом[ЗначениеМассивом.ВГраница()];
Если ЗначениеМассивом.Количество() > 1 Тогда
Если СтрДлина(Элемент) = 2 Или СтрДлина(Элемент) = 4 Тогда
ЭтоТолькоЦифры = СтрРазделить(Элемент, НаборЦифр, Ложь).Количество() = 0;
Если ЭтоТолькоЦифры Тогда
ЗначениеДата = Значение;
ЗначениеВремя = "";
Иначе
ЗначениеВремя = Элемент;
ЗначениеМассивом.Удалить(ЗначениеМассивом.ВГраница());
ЗначениеДата = СтрСоединить(ЗначениеМассивом, " ");
КонецЕсли;
Иначе
ЗначениеВремя = Элемент;
ЗначениеМассивом.Удалить(ЗначениеМассивом.ВГраница());
ЗначениеДата = СтрСоединить(ЗначениеМассивом, " ");
КонецЕсли;
Иначе
ЭтоТолькоЦифры = СтрРазделить(Элемент, НаборЦифр, Ложь).Количество() = 0;
Если ЭтоТолькоЦифры Тогда
Результат = ОписаниеТипаДата.ПривестиЗначение(Элемент);
Если Не ЗначениеЗаполнено(Результат) И СтрДлина(Элемент) = 8 Тогда
ПеревернутаяДата = Сред(Элемент, 5) + Сред(Элемент, 3, 2) + Лев(Элемент, 2);
Результат = ОписаниеТипаДата.ПривестиЗначение(ПеревернутаяДата);
КонецЕсли;
Возврат Результат;
ИначеЕсли СтрНайти(Элемент, ":") > 0 Тогда
ЗначениеДата = "";
ЗначениеВремя = Элемент;
Иначе
ЗначениеДата = Элемент;
ЗначениеВремя = "";
КонецЕсли;
КонецЕсли;
ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
Если ЗначениеЗаполнено(ЗначениеДата) И ЧастьДаты <> ЧастиДаты.Время Тогда
НаборРазделителей = СтрСоединить(СтрРазделить(ЗначениеДата, НаборЦифр, Ложь), "");
ЗначениеДатаМассивом = СтрРазделить(ЗначениеДата, НаборРазделителей, Ложь);
ЭтоТолькоЦифры = СтрРазделить(ЗначениеДата, НаборЦифр, Ложь).Количество() = 0;
Если НЕ ЭтоТолькоЦифры Тогда
Год = 1;
Месяц = 1;
День = 1;
Если СтрДлина(ЗначениеДатаМассивом[0]) = 4 Тогда
Год = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[0]);
ГодВНачале = Истина;
Иначе
День = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[0]);
ГодВНачале = Ложь;
КонецЕсли;
Если ЗначениеДатаМассивом.Количество() = 2 Тогда
Месяц = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[1]);;
ИначеЕсли ЗначениеДатаМассивом.Количество() > 2 Тогда
Месяц = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[1]);
Если ГодВНачале Тогда
День = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[2]);
Иначе
Год = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[2]);
КонецЕсли;
КонецЕсли;
Если СтрДлина(Год) < 3 Тогда
ГодЧислом = ОписаниеТипаЧисло.ПривестиЗначение(Год);
Год = ?(ГодЧислом < 30, 2000, 1900) + ГодЧислом;
Иначе
Год = ОписаниеТипаЧисло.ПривестиЗначение(Год);
КонецЕсли;
ЗначениеДата = Формат(Год, "ЧЦ=4; ЧН=0001; ЧВН=; ЧГ=0")
+ Формат(Месяц, "ЧЦ=2; ЧН=01; ЧВН=; ЧГ=0")
+ Формат(День, "ЧЦ=2; ЧН=01; ЧВН=; ЧГ=0");
Иначе
Если СтрДлина(ЗначениеДата) = 6 Тогда
Год = Прав(ЗначениеДата, 2);
ГодЧислом = ОписаниеТипаЧисло.ПривестиЗначение(Год);
ЗначениеДата = ?(ГодЧислом < 30, 2000, 1900) + Год + Сред(ЗначениеДата, 3, 2) + Лев(ЗначениеДата, 2) ;
ИначеЕсли СтрДлина(ЗначениеДата) = 8 Тогда
Результат = ОписаниеТипаДата.ПривестиЗначение(ЗначениеДата);
Если Не ЗначениеЗаполнено(Результат) Тогда
ПеревернутаяДата = Сред(ЗначениеДата, 5) + Сред(ЗначениеДата, 3, 2) + Лев(ЗначениеДата, 2);
Результат = ОписаниеТипаДата.ПривестиЗначение(ПеревернутаяДата);
Если ЗначениеЗаполнено(Результат) Тогда
ЗначениеДата = ПеревернутаяДата;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Иначе
ЗначениеДата = "00010101";
КонецЕсли;
Если ЗначениеЗаполнено(ЗначениеВремя) И ЧастьДаты <> ЧастиДаты.Дата Тогда
ЭтоТолькоЦифры = СтрРазделить(ЗначениеВремя, НаборЦифр, Ложь).Количество() = 0;
Если НЕ ЭтоТолькоЦифры Тогда
НаборРазделителей = СтрСоединить(СтрРазделить(ЗначениеВремя, НаборЦифр, Ложь), "");
ЗначениеВремяМассивом = СтрРазделить(ЗначениеВремя, НаборРазделителей, Ложь);
Час = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеВремяМассивом[0]);
Минута = 0;
Секунда = 0;
Если ЗначениеВремяМассивом.Количество() = 2 Тогда
Минута = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеВремяМассивом[1]);
ИначеЕсли ЗначениеВремяМассивом.Количество() > 2 Тогда
Минута = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеВремяМассивом[1]);
Секунда = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеВремяМассивом[2]);
КонецЕсли;
ШаблонФормата = "ЧЦ=2; ЧН=00; ЧВН=; ЧГ=0";
ЗначениеВремя = Формат(Час, ШаблонФормата)
+ Формат(Минута, ШаблонФормата)
+ Формат(Секунда, ШаблонФормата);
КонецЕсли;
Иначе
ЗначениеВремя = "000000";
КонецЕсли;
Результат = ОписаниеТипаДата.ПривестиЗначение(ЗначениеДата + ЗначениеВремя);
Возврат Результат;
КонецФункции
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
Строка в дату по форматной строке
Функция для превращения строки в дату по форматной строке
Получить дату из строки формата YYYY-MM-DDThh:mm:ss ISO 8601
Универсальные процедуры для работы с логами