Каталог решений - Функция получения даты из текста по форматной строке

Функция получения даты из текста по форматной строке

Функция получения даты из текста по форматной строке

В наличии

Преобразует текст в дату при условии наличия форматной строки

Категория:

Описание

Несколько громоздская, но полезная функция.

Добавил распознование строковых месяцев, но только на русском языке.

Очень красивое решение предоставил ildarovich, советую использовать сразу его код:

Функция СтрокаВДату(Знач ФорматДаты, Знач Дано, Ошибка = Ложь) Экспорт 
	Попытка 
		ё = Формат('00010101', "ДФ=" + ФорматДаты) // - необязательная проверка первого правильности параметра 
	Исключение 
		Ошибка = Истина; 
		Возврат '00010101' 
	КонецПопытки; 
	Ч = Новый Соответствие; 
	Для ё = 1 По СтрДлина(ФорматДаты) + 7 Цикл 
		Ч[Сред(ФорматДаты + "dMyHhms", ё, 1)] = 0	// - инициализация частей даты 
	КонецЦикла; 
	Для ё = 1 По 12 Цикл 
		Дано = СтрЗаменить(Дано, Формат(Дата(1, ё, 1), "ДФ=MMММ"), Формат(ё, "ЧЦ=4; ЧВН=")); // - замена названий месяцев числами 
		Дано = СтрЗаменить(Дано, Формат(Дата(1, ё, 1), "ДФ=MMМ" ), Формат(ё, "ЧЦ=3; ЧВН=")) 
	КонецЦикла; 
	Для ё = 1 По СтрДлина(ФорматДаты) Цикл 
		Ч[Сред(ФорматДаты, ё, 1)] = 10 * Ч[Сред(ФорматДаты, ё, 1)] + Найти("123456789", Сред(Дано, ё, 1)); // - накопление частей даты 
		Ошибка = Ошибка ИЛИ Найти("dMyHhms", Сред(ФорматДаты, ё, 1)) И НЕ Найти("0123456789", Сред(Дано, ё, 1)) // - необязательная проверка на цифры 
	КонецЦикла; 
	Ч["y"] = Ч["y"] + ?(Ч["y"] < 50, 2000, ?(Ч["y"] < 100, 1900, 0)); // - дополнение двух цифр года до четырех 
	Попытка 
		Возврат Дата(Ч["y"], Ч["M"], Ч["d"], Ч["H"] + Ч["h"], Ч["m"], Ч["s"]) 
	Исключение 
		Ошибка = Истина; 
		Возврат '00010101' 
	КонецПопытки 
КонецФункции

Моя функция:

Функция ПолучитьДатуИзТекста(Текст,ФорматнаяСтрока) Экспорт
	Перем Значение;
	
	ПустаяДата = '00010101';
	Год = 1; Месяц=1; День = 1; час = 0; Мин=0; Сек=0;
	тмпТекст = Текст;
	ЗначащиеСимволы = "dMyHhms";
	СтрокаПараметра = "";
	ФорматнаяСтрока = СокрЛП(ФорматнаяСтрока)+" ";
	ПредСимв = Лев(ФорматнаяСтрока,1);
	Для к=1 по СтрДлина(ФорматнаяСтрока) Цикл
		Симв = Сред(ФорматнаяСтрока,к,1);
		Если ПредСимв<>Симв Тогда
			Если Найти(ЗначащиеСимволы,ПредСимв)>0 Тогда
				//ЭтоПараметр
				Если СтрДлина(СтрокаПараметра)=2 Тогда
					Попытка
						Значение = Число(Лев(тмпТекст,2));
					Исключение
						#Если Клиент Тогда
							Предупреждение("Не удалось выполнить преобразование!");
						#КонецЕсли
						Возврат ПустаяДата;
					КонецПопытки;
					
					тмпТекст = Сред(тмпТекст,3);
				ИначеЕсли СтрокаПараметра="yyyy" Тогда
					Попытка
						Значение = Число(Лев(тмпТекст,4));
					Исключение
						#Если Клиент Тогда
							Предупреждение("Не удалось выполнить преобразование!");
						#КонецЕсли
						Возврат ПустаяДата;
					КонецПопытки;
					тмпТекст = Сред(тмпТекст,5);
				ИначеЕсли СтрДлина(СтрокаПараметра)=1 Тогда
					дл = "";
					Попытка
						Значение = Число(Лев(тмпТекст,2));
					Исключение
						Попытка
							Значение = Число(Лев(тмпТекст,1));
							дл=1;
						Исключение
							#Если Клиент Тогда
								Предупреждение("Не удалось выполнить преобразование!");
							#КонецЕсли
							Возврат ПустаяДата;
						КонецПопытки;
					КонецПопытки;
					
					Если дл="" Тогда
						Если (СтрокаПараметра = "d" и Значение>31)ИЛИ(СтрокаПараметра = "M" и Значение>12)ИЛИ(СтрокаПараметра = "H" и Значение>23)
							ИЛИ(СтрокаПараметра = "h" и Значение>12)ИЛИ(СтрокаПараметра = "m" и Значение>59)ИЛИ(СтрокаПараметра = "s" и Значение>59) Тогда
							Попытка
								Значение = Число(Лев(тмпТекст,2));
								дл=2;
							Исключение
								#Если Клиент Тогда
									Предупреждение("Не удалось выполнить преобразование!");
								#КонецЕсли
								Возврат ПустаяДата;
							КонецПопытки;
						Иначе
							Попытка
								Значение = Число(Лев(тмпТекст,1));
								дл=1;
							Исключение
								#Если Клиент Тогда
									Предупреждение("Не удалось выполнить преобразование!");
								#КонецЕсли
								Возврат ПустаяДата;
							КонецПопытки;
						КонецЕсли;	
					КонецЕсли;	
					
					тмпТекст = Сред(тмпТекст,дл+1);
				ИначеЕсли СтрокаПараметра="MMM" или СтрокаПараметра="MMMM" Тогда
					Значение = 0;
					Для м=1 по 12 Цикл
						ТекстМесяца = Сред(Формат(Дата(2000,м,1),"ДФ=d."+СтрокаПараметра),3);
						Если Найти(тмпТекст,ТекстМесяца)>0 Тогда
							Значение = м;
							Прервать;
						КонецЕсли;
					КонецЦикла;
					Если Значение = 0 Тогда
						#Если Клиент Тогда
							Предупреждение("Не удалось выполнить преобразование!");
						#КонецЕсли
						Возврат ПустаяДата;
					КонецЕсли;
					тмпТекст = Сред(тмпТекст,СтрДлина(ТекстМесяца)+1);
				Иначе
					#Если Клиент Тогда
						Предупреждение("Не верный формат даты или форматной строки!");
					#КонецЕсли
					Возврат ПустаяДата;
				КонецЕсли;
				
				//Установим параметры
				Если ПредСимв = "d" Тогда
					День = Значение;
				ИначеЕсли ПредСимв = "M" Тогда
					Месяц = Значение;
				ИначеЕсли ПредСимв = "y" Тогда
					Если СтрокаПараметра = "yy" Тогда
						ТекВек = 100*Цел(Год(ТекущаяДата())/100);
						год = ?(Значение>=Год(ТекущаяДата())-текВек+50,ТекВек-100,ТекВек)+Значение;
					Иначе
						Год = Значение;
					КонецЕсли;
				ИначеЕсли ПредСимв = "H" Тогда
					час = Значение;
				ИначеЕсли ПредСимв = "h" Тогда
					час = Значение;
					#Если Клиент Тогда
						Сообщить("Вычисление часа не гарантировано.");
					#КонецЕсли
				ИначеЕсли ПредСимв = "m" Тогда
					Мин = Значение;
				ИначеЕсли ПредСимв = "s" Тогда
					Сек = Значение;
				КонецЕсли;
				
			Иначе
				//Это Разделитель
				тмпТекст = Сред(тмпТекст,СтрДлина(СтрокаПараметра)+1);
			КонецЕсли;
			СтрокаПараметра = Симв;
		Иначе
			СтрокаПараметра=СтрокаПараметра+Симв;
		КонецЕсли;
		ПредСимв = Симв;
	КонецЦикла;
	Возврат Дата(Год,Месяц,День,час,Мин,Сек);
КонецФункции		
has been added to your cart:
Оформление заказа