Функция СтрокаВДатуВремя(ДатаСтрока, ФорматДаты = Неопределено, ПриОшибкиБезФормата = Ложь) Экспорт
Если НЕ ЗначениеЗаполнено(ДатаСтрока) Тогда
Возврат Дата(1,1,1);
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ФорматДаты) тогда
СимволыЦифры = "0123456789";
ФлагПоловиныСуток = "";
НомГода = 0;
МассивЧастей = Новый Массив;
СтрокаЧасти = "";
Для Сч = 1 По СтрДлина(ДатаСтрока) Цикл
Сим = Прав(Лев(ДатаСтрока, Сч), 1);
Если СтрНайти(СимволыЦифры, Сим) <> 0 тогда
СтрокаЧасти = "" + СтрокаЧасти + Сим;
Иначе
Если ЗначениеЗаполнено(СтрокаЧасти) тогда
МассивЧастей.Добавить(Число(СтрокаЧасти));
Если СтрДлина(СтрокаЧасти) И МассивЧастей.Количество() < 4 тогда
НомГода = МассивЧастей.Количество();
КонецЕсли;
СтрокаЧасти = "";
КонецЕсли;
Если Сим = "P" ИЛИ Сим = "A" тогда
Если СтрДлина(ДатаСтрока) >= Сч + 1 тогда
СлСим = Прав(Лев(ДатаСтрока, Сч + 1), 1);
Если СлСим = "M" тогда
ФлагПоловиныСуток = "" + Сим + СлСим;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(СтрокаЧасти) тогда
МассивЧастей.Добавить(Число(СтрокаЧасти));
Если СтрДлина(СтрокаЧасти) И МассивЧастей.Количество() < 4 тогда
НомГода = МассивЧастей.Количество();
КонецЕсли;
КонецЕсли;
Если МассивЧастей.Количество() > 6 тогда
ВызватьИсключение "Ошибка преобразования строки """ + ДатаСтрока + """ в дату: попробуйте указать формат даты!";
ИначеЕсли МассивЧастей.Количество() = 1 тогда
Попытка
Возврат Дата(МассивЧастей[0]);
Исключение
ВызватьИсключение "Ошибка преобразования строки """ + ДатаСтрока + """ в дату: некорректно передана дата без разделителей, попробуйте указать формат даты!";
КонецПопытки;
КонецЕсли;
Годы = 1;
Месяцы = 1;
Дни = 1;
Часы = 0;
Минуты = 0;
Секунды = 0;
Если НомГода = 1 тогда
Годы = МассивЧастей[0];
Месяцы = МассивЧастей[1];
Если НЕ МассивЧастей.Количество() = 2 тогда
Дни = МассивЧастей[2];
КонецЕсли;
Если НЕ МассивЧастей.Количество() = 3 тогда
Часы = МассивЧастей[3];
КонецЕсли;
Если НЕ МассивЧастей.Количество() = 4 тогда
Минуты = МассивЧастей[4];
КонецЕсли;
Если НЕ МассивЧастей.Количество() = 5 тогда
Секунды = МассивЧастей[5];
КонецЕсли;
ИначеЕсли НомГода = 3 тогда
Годы = МассивЧастей[2];
Месяцы = МассивЧастей[1];
Дни = МассивЧастей[0];
Если НЕ МассивЧастей.Количество() = 3 тогда
Часы = МассивЧастей[3];
КонецЕсли;
Если НЕ МассивЧастей.Количество() = 4 тогда
Минуты = МассивЧастей[4];
КонецЕсли;
Если НЕ МассивЧастей.Количество() = 5 тогда
Секунды = МассивЧастей[5];
КонецЕсли;
Иначе
ВызватьИсключение "Ошибка преобразования строки """ + ДатаСтрока + """ в дату: не стандартный формат года, попробуйте указать формат даты!";
КонецЕсли;
Если ЗначениеЗаполнено(ФлагПоловиныСуток) тогда
Если ФлагПоловиныСуток = "AM" тогда
Часы = ?(Часы = 12, 0, Часы);
Иначе
Часы = ?(Часы = 12, Часы, Часы + 12);
КонецЕсли;
КонецЕсли;
Попытка
Возврат Дата(Годы, Месяцы, Дни, Часы, Минуты, Секунды);
Исключение
ВызватьИсключение "Ошибка преобразования строки """ + ДатаСтрока + """ в дату: попробуйте указать формат даты!";
КонецПопытки;
Иначе
Попытка
Годы = СтрНайти(ФорматДаты, "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)))
)
Исключение
Если ПриОшибкиБезФормата тогда
Возврат СтрокаВДатуВремя(ДатаСтрока);
Иначе
ВызватьИсключение "Ошибка преобразования строки """ + ДатаСтрока + """ в дату по формату """ + ФорматДаты + """";
КонецЕсли;
КонецПопытки;
КонецЕсли;
Возврат Неопределено;
КонецФункции
|