Имя: Пароль:
1C
1С v8
Преобразовать строку в дату (31 марта 2018 г.)
,
0 illiona
 
naïve
14.03.18
11:59
Всем добрый день. Помогите преобразовать строку вида "31 марта 2018 г." в дату
1 shadow_sw
 
14.03.18
12:03
разделить на части день месяц год, разделитель пробел
потом формат()
2 Гипервизор
 
14.03.18
12:04
(1) Формат() на выходе дает строку, а нужна дата.
3 exwill
 
14.03.18
12:05
(0) Дата(2018,3,31)
4 Гипервизор
 
14.03.18
12:06
(3) Я ждал этого варианта! ))
5 Малыш Джон
 
14.03.18
12:07
(3) :)))

(0) а строка имеет фиксированный вид?
6 exwill
 
14.03.18
12:09
(4) (5) Что вы смеетесь? Хороший ответ. Я бы даже сказал - наилучший. "... научи человека ловить рыбу..."
7 mehfk
 
14.03.18
12:11
(0) Выведи дату строкой и запроси у пользователя дату. Скажи что это защита от роботов - капча.
8 illiona
 
naïve
14.03.18
12:12
нет не фиксированный, просто как пример написала
9 illiona
 
naïve
14.03.18
12:13
может быть 1 марта 2018 г. , 2 марта 2018 г.
10 exwill
 
14.03.18
12:14
(9) Это и есть фиксированный вид.
11 spectre1978
 
14.03.18
12:15
(0) делите в массив по пробелам, потом ищете во втором элементе все возможные строковые наименования месяца и заменяете на соответствующее число ("марта" на "3"). Потом преобразуете все элементы к числу и делаете (3).
12 spectre1978
 
14.03.18
12:16
И если во входящих данных есть разные способы написания строки, например Март 02 2018, 2 марта 2018 и прочие, то вам придется изрядно помахаться и все равно не факт что всегда распознает верно.
13 НЕА123
 
14.03.18
12:17
стрДата = "31 марта 2018 г."
дата = Дата(СтрЗаменить(Стрзаменить(стрДата," марта ",".3."), "г.", "00:00:00"))
14 catena
 
14.03.18
12:18
ДатаСтр = "31 марта 2018 г.";
ДатаНач = Дата(1800,1,1);

Для ш=0 по 365000 Цикл
    ДатаТек = ДатаНач+60*60*24*ш;
    Если Формат(ДатаТек,"ДФ='дд ММММ гггг ''г.'''") = ДатаСтр Тогда
        Сообщить(ДатаТек);
        Прервать;
    КонецЕсли;    
КонецЦикла;
15 illiona
 
naïve
14.03.18
12:18
вместо марта может быть апрель, т.е. любая дата в таком виде
16 exwill
 
14.03.18
12:19
(15) А сколько всего месяцев может быть?
17 Малыш Джон
 
14.03.18
12:21
(16) эмммм... ну вроде двенадцать, если ничего не поменялось...
18 spectre1978
 
14.03.18
12:22
я бы искал "январ", "феврал", "март", "апрел", {"май, мая"}, "июн", "июл", "август", "сентябр", "октябр", "ноябр", "декабр". При нахождении соответствующего куска подставлял бы номер месяца.
19 spectre1978
 
14.03.18
12:22
и естетственно без учета регистра
20 Малыш Джон
 
14.03.18
12:23
...запомнытэ, дэти, "вилька" и "тарелька" пишутся бэз мягкого знака...
21 Малыш Джон
 
14.03.18
12:24
(18) вроде как, кроме "января", "февраля" и т.д. там ничего не должно попадаться?
22 spectre1978
 
14.03.18
12:24
(20) на случай возможных написаний в именительном и и родительном падеже
23 spectre1978
 
14.03.18
12:26
(21) а вдруг. Иногда пишут в американской нотации Май 18, 2018. Мне попадалось.
24 Малыш Джон
 
14.03.18
12:27
(0) как в (13) делать:

СтрДата = "31 марта 2018 г.";
СтрДата = СтрЗаменить(стрДата," января ",".1.");
СтрДата = СтрЗаменить(стрДата," февраля ",".2.");
СтрДата = СтрЗаменить(стрДата," марта ",".3.");
...
СтрДата = СтрЗаменить(стрДата," г.","");

Дата = Дата(СтрДата);
25 Малыш Джон
 
14.03.18
12:27
(23) ну я про фиксированный вид не зря же спрашивал
26 Рэйв
 
14.03.18
12:36
дат="1 января 2018";
спМес=Новый СписокЗначений;
спМес.Добавить("ЯНВАРЯ");
спМес.Добавить("ФЕВРАЛЯ");
спМес.Добавить("МАРТА");
спМес.Добавить("АПРЕЛЯ");
спМес.Добавить("МАЯ");
спМес.Добавить("ИЮНЯ");
спМес.Добавить("ИЮЛЯ");
спМес.Добавить("АВГУСТА");
спМес.Добавить("СЕНТЯБРЯ");
спМес.Добавить("ОКТЯБРЯ");
спМес.Добавить("НОЯБРЯ");
спМес.Добавить("ДЕКАБРЯ");

датПроверка=ВРЕГ(дат);
Мес=0;
Для Каждого Эл из спМес Цикл
    Мес=Мес+1;
    Если Найти(датПроверка,Эл.Значение)>0 Тогда
        Прервать;
    КонецЕсли;    
КонецЦикла;    
Мес=""+Мес;
Если СтрДлина(Мес)=1 Тогда
    Мес="0"+Мес;
КонецЕсли;    
Цифры="0123456789";
Год="";
День="";
Первый=Истина;
Для  н=1 по СтрДлина(дат) Цикл
    Сим=Сред(дат,н,1);
    Если Найти(Цифры,Сим)>0 Тогда
        Если Первый Тогда
            День=День+Сим;
            
        Иначе    
            Год=Год+Сим;
            Если СтрДлина(Год)=4 Тогда
                Прервать;
            КонецЕсли;    
        КонецЕсли;    
    Иначе
        Первый=Ложь;
    КонецЕсли;    
Конеццикла;    
Если СтрДлина(День)=1 Тогда
    День="0"+День;
КонецЕсли;    
Дат=Дата(Год+Мес+День)    ;
Сообщить("->"+Дат);
27 Рэйв
 
14.03.18
12:37
только формат должен быть фиксированный - сначала цифрой день, потом строкой месяц,потом 4 цифры год
28 Tatitutu
 
14.03.18
12:44
и не кто не спросил

а откуда ты берешь это строчку...

из Excel

так там .Value и .Text
по разному отбображается

т.е. в ячейке дата 31.03.2018
а отображается - "31 марта 2018 г."

https://yadi.sk/d/sWSPwJq93TMVnZ

а мы тут алгоритмы строчим - не разобравшись )))
29 catena
 
14.03.18
12:46
(28)Каков вопрос - таков ответ
30 Малыш Джон
 
14.03.18
12:47
(28) мы ж одинэсники) у нас задача - не разобраться, у нас задача - накодить)
31 Tatitutu
 
14.03.18
12:48
+(28)
т.е (0) скорее всего обработывает данные из EXCEL

....
Нужнаядата = Cells(10,25).text ;

получает "31 марта 2018 г." тип Строка
и теперь пытается с помощью всемирного разума преврать
строку в дату
....

Нужнаядата = Cells(10,25).value ;

получишь '31.03.2018' - тип дата
32 Рэйв
 
14.03.18
12:48
(28)Это ТС за "как надо" работающий код деньги платят, а нам задача интересна в абстрактном смысле:-)
33 НЕА123
 
14.03.18
12:54
(24)
>СтрДата = СтрЗаменить(стрДата," г.","");

без времени не работает Дата().
СтрДата = СтрЗаменить(стрДата," г.","00:00:00");
34 Малыш Джон
 
14.03.18
13:20
(33) да, ты прав