В начало

Преобразование строки в дату

 

Листинг. Функция

Функция СтрВДату(Знач сДата)

   

    Перем п_мТЕМП; // массив временных переменных

   

//-----для локализации ------------------------------

    Перем п_мФорматы;

    п_мФорматы = Новый Массив(4);

    п_мФорматы[0] = "г";    // знак года

    п_мФорматы[1] = "ЧЦ=2; ЧН=; ЧВН=";

    п_мФорматы[2] = "ЧГ=0";   

    п_мФорматы[3] = "ДФ=МММ";

//---------------------------------------------------

 

    Если ПустаяСтрока(сДата) Тогда

        п_мТЕМП[6] =Дата("00010101000000");

        Возврат п_мТЕМП[6];

    КонецЕсли;

   

    сДата = Формат(сДата, п_мФорматы[2]);        //на случай если в формате 1с числом: 20150320220315. (+локализация)

 

 //Если использовать конструкцию "Если Найти(сДата,..." , то перебор букв строки будет происходить 2а раза: Найти и СтрЗаменить //Использование Найти в данном случае бессмысленно

    // можно добавить любой разделитель - @, #, %, и тд, неважно. Главное, заменить их на "."

    сДата = СтрЗаменить(сДата, "«", "");             //«1 Фев 05 г.»

    сДата = СтрЗаменить(сДата, "»", "");            //«1 Фев 05 г.»

     сДата = СтрЗаменить(сДата, п_мФорматы[0] + ".", "");   //1 Фев 05 г. 17:20:00 //просто "г" нельзя из-за "авГуст", например. Но в далее,после парсинга месяца, любое "г" в строке,  удаляется

    сДата = СтрЗаменить(сДата, "/", ".");            // 1/2/5

    сДата = СтрЗаменить(сДата, "\", ".");            // 1\02\05

    сДата = СтрЗаменить(сДата, "-", ".");            // 1-02-05

    сДата = СтрЗаменить(сДата, Символы.Таб, ".");        // 01.02.2005    17:20:00   

    сДата = СтрЗаменить(сДата, " ", ".");            // 1/02 2005 17:20:00

    сДата = СтрЗаменить(сДата, "..",  ".");            //Возможны, появление двойных точек из за "янв." в "янв" или из-за " г. ".   

    сДата = НРег(СокрЛП(сДата));                 // строку в нижний регистр, чтоб проще было с Янв Январь янв и тд

   

    п_мТЕМП = Новый массив(7);//массив для временных переменных   

   

    п_мТЕМП[0] = Найти(сДата,".");

   

    Если п_мТЕМП[0] = 0 Тогда

        //если точек нет

       

        Если Найти(сДата,":") Тогда

                //только время (или ошибка)

                сДата = "01.01.0001." + сДата;

                п_мТЕМП[0] = Найти(сДата,".");

        иначе           

                //похоже на формат 1с. Можно добавить "попытку"...

                п_мТЕМП[6] = дата(сДата);

                Возврат п_мТЕМП[6];

 

        КонецЕсли;   

       

       

    //иначеЕсли п_мТЕМП[0] = 1 Тогда

    //        //например, месяц и год

    КонецЕсли;

   

 

    // ----- ДНИ -------------------------------------

    п_мТЕМП[0] = Лев(сДата, п_мТЕМП[0] - 1);//дни

    п_мТЕМП[4] = Прав(сДата, СтрДлина(сДата) - СтрДлина(п_мТЕМП[0])-1);// месяц и все что справа

    п_мТЕМП[0] = Формат(Число(п_мТЕМП[0]),п_мФорматы[1]);//дни в формат двух чисел

    // ----- Месяц -----------------------------------

    п_мТЕМП[1] = Лев(п_мТЕМП[4], найти(п_мТЕМП[4],".") - 1);// месяц

 

            //+++

            //даты с маем, июнем и июлем не преобразуются в тип «Дата»

            п_мТЕМП[1] = СтрЗаменить(п_мТЕМП[1], "мая", "май");

            п_мТЕМП[1] = СтрЗаменить(п_мТЕМП[1], "июня", "июнь");

            п_мТЕМП[1] = СтрЗаменить(п_мТЕМП[1], "июля", "июль");

            //---

           

    п_мТЕМП[4] = Прав(п_мТЕМП[4], СтрДлина(п_мТЕМП[4]) - СтрДлина(п_мТЕМП[1])-1);// год и все что справа

    //Возможны варианты месяца "янв" "янв." "январь" "января"

    Если СтрДлина(п_мТЕМП[1]) > 2 Тогда // месяц в виде янв или январь

       

        п_мТЕМП[2] = 0;

        Пока п_мТЕМП[2] < 12 Цикл

           

            п_мТЕМП[2] = п_мТЕМП[2]+1;

            // берем из "янв." только "янв"

            п_мТЕМП[3] = СтрЗаменить(Формат(Дата("2001" + Формат(п_мТЕМП[2],п_мФорматы[1]) + "01"), п_мФорматы[3]),".","");// + локализация

           

            п_мТЕМП[3] = найти(п_мТЕМП[1], п_мТЕМП[3]);

           

            Если п_мТЕМП[3] > 0 тогда

                п_мТЕМП[1] = Формат(п_мТЕМП[2],п_мФорматы[1]);

                прервать;

            КонецЕсли;

        КонецЦикла;   

    Иначе

        п_мТЕМП[1] = Формат(Число(п_мТЕМП[1]),п_мФорматы[1]);

    КонецЕсли;

    // ----- ГОД -----------------------------------

    //Если в строке было "г" без точки("г.")

    п_мТЕМП[4] = СтрЗаменить(п_мТЕМП[4], п_мФорматы[0], "");

    //ищем год. Дата может быть без времени, т.е. год последний в строке

    п_мТЕМП[2] = Найти(п_мТЕМП[4],".");

   

    Если п_мТЕМП[2]>0 Тогда

        п_мТЕМП[2] =  Лев(п_мТЕМП[4], п_мТЕМП[2] - 1);// год

        п_мТЕМП[4] = Прав(п_мТЕМП[4], СтрДлина(п_мТЕМП[4]) - СтрДлина(п_мТЕМП[2])-1);//время и все что справа

    Иначе

        п_мТЕМП[2] = п_мТЕМП[4];

        п_мТЕМП[4] = "";

    КонецЕсли;   

   

    //проверяем год

    п_мТЕМП[3] = СтрДлина(п_мТЕМП[2]);

    //если год из двух цыфр

    Если п_мТЕМП[3] = 2 или п_мТЕМП[3] = 1 Тогда

        п_мТЕМП[3] = Число(п_мТЕМП[2]);// год как число

       

        //что означает 15 в "20.03.15"? это 2015г или 1915г? (Настраиваем под себя или выдаём ошибку)

        // в моем варианте если  < 50 то это 2000г. иначе 1900г.

        Если п_мТЕМП[3] < 50 Тогда

            п_мТЕМП[2] = "20" + Формат(п_мТЕМП[3],п_мФорматы[1]);

        Иначе

            п_мТЕМП[2] = "19" + Формат(п_мТЕМП[3],п_мФорматы[1]);

        КонецЕсли;   

       

    КонецЕсли;

 

    // =======================  Форматируем время ==============================

    п_мТЕМП[6] = СтрЗаменить(п_мТЕМП[4],":", ".");// если дата была, например: 17-30-10, то сейчас 17.30.10

    //"попытка" на преобразование даты, по времени, занимает столько же, а по ресурсам больше, чем сам парсинг времени.

    //поэтому, убиваем двух зайцев перебором часы/мин/сек сразу

    Если СтрДлина(п_мТЕМП[6]) > 0 Тогда

       

        п_мТЕМП[5] = найти(п_мТЕМП[6],".");

        Если п_мТЕМП[5] > 0 Тогда

            // ========= часы    =================

            п_мТЕМП[3] = Лев(п_мТЕМП[6], найти(п_мТЕМП[6],".") - 1);//часы

            п_мТЕМП[6] = Прав(п_мТЕМП[6], СтрДлина(п_мТЕМП[6]) - СтрДлина(п_мТЕМП[3])-1);// минуты и все что справа

           

            Если п_мТЕМП[3] = "" тогда

                п_мТЕМП[3] = "00";       

            Иначе

                //при переводе в дату лидирующий 0 у часов удаляется. Т.е. след. строка бесполезна

                //п_мТЕМП[3] = Формат(Число(п_мТЕМП[3]),п_мФорматы[1]);//часы в формат двух чисел    

            КонецЕсли;       

           

            п_мТЕМП[5] = найти(п_мТЕМП[6],".");

            Если п_мТЕМП[5] > 0 Тогда

                // ========= минуты    =================

                п_мТЕМП[4] = Лев(п_мТЕМП[6], найти(п_мТЕМП[6],".") - 1);

                п_мТЕМП[6] = Прав(п_мТЕМП[6], СтрДлина(п_мТЕМП[6]) - СтрДлина(п_мТЕМП[4])-1);// секунды и все что справа

                Если п_мТЕМП[4] = "" тогда

                    п_мТЕМП[4] = "00";       

                Иначе

                    п_мТЕМП[4] = Формат(Число(п_мТЕМП[4]),п_мФорматы[1]);//минуты в формат двух чисел    

                КонецЕсли;

               

                // ========= секунды    =================

                Если СтрДлина(п_мТЕМП[6]) = 0 Тогда

                    п_мТЕМП[5] = "00";       

                Иначе

                    п_мТЕМП[5] = Формат(Число(п_мТЕМП[6]),п_мФорматы[1]);//секунды в формат двух чисел    

                КонецЕсли;

               

            Иначе

                п_мТЕМП[4] = Формат(Число(п_мТЕМП[6]),п_мФорматы[1]);   

                п_мТЕМП[5] = "00";           

            КонецЕсли;    

        Иначе

            п_мТЕМП[3] = Формат(Число(п_мТЕМП[6]),п_мФорматы[1]);       

            п_мТЕМП[4] = "00";

            п_мТЕМП[5] = "00";

        КонецЕсли;

       

    Иначе

        п_мТЕМП[3] = "00";       

        п_мТЕМП[4] = "00";

        п_мТЕМП[5] = "00";           

    КонецЕсли;

   

    п_мТЕМП[6] = п_мТЕМП[0] + "." + п_мТЕМП[1] + "." + п_мТЕМП[2] + " " + п_мТЕМП[3] + ":" + п_мТЕМП[4] + ":" + п_мТЕМП[5];

    п_мТЕМП[6] = дата(п_мТЕМП[6]);

   

    Возврат п_мТЕМП[6];

    

КонецФункции