СтрокаВДату (БСП)

Автор: 1С
ОбщийМодуль.СтроковыеФункцииКлиентСервер
БСП

Строка дату. Преобразует исходную строку в дату.

// Преобразует исходную строку в дату. 
// Если дату не удалось распознать, то возвращается пустая дата (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

ИнтервалВремениСтрокой (БСП)

Универсальные процедуры для работы с логами

Добавить к дате и разность дат

Раскрасить даты календаря

TurboConf ИР адаптер 1.75