(дата1- дата2 )-> год, мес, дней

1. Lesha1C 245 29.03.08 14:54 Сейчас в теме
Возникла ситуация: есть две даты. Необходимо узнать каков этот период ,чтобы определялся сколько лет, месяцев и дней. Может у кого есть примеры как это осуществить или может подскажите как реализовать?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. CheBurator 2725 29.03.08 16:33 Сейчас в теме
15 марта и 16 апреля - сколько месяцев и сколько дней?
3. Lesha1C 245 29.03.08 17:59 Сейчас в теме
сколько месяев прошло с даты1 до даты 2, в твоем случае 1 мес 1 день
4. CheBurator 2725 29.03.08 21:59 Сейчас в теме
Доложите конкретно - какой месяц, сколько в этом "прошедшем" месяце дней? 28, 29, 30, 31...?
5. CheBurator 2725 29.03.08 22:17 Сейчас в теме
ответь на вопрос: какова разность
между 31.12.08 и 01.01.08
???
код примерно вот так выглядит
Код
Процедура Сформировать()
  ТекДата = Дата1;
  КолвоМесяцев = 0;
  Пока ТекДата <= Дата2 Цикл
    ТекДата = ДобавитьМесяц(ТекДата,1);
    КолвоМесяцев = КолвоМесяцев + 1;
  КонецЦикла;   
  КолвоМесяцев = КолвоМесяцев - 1;
  Дней = Дата2 - ДобавитьМесяц(ТекДата,-1);
  Лет = Цел(КолвоМесяцев/12);
  КолвоМесяцев = КолвоМесяцев - Лет * 12;
  Сообщить(""+Лет+"/"+КолвоМесяцев+"/"+Дней);
КонецПроцедуры
Показать полностью
6. Abadonna 3971 29.03.08 22:24 Сейчас в теме
Код
Процедура Сформировать()
   ТекДата=НачДата;
   СчМес=0;
   Пока ТекДата<КонДата Цикл 
      СчМес=СчМес+1; 
      ТекДата=ДобавитьМесяц(ТекДата,1);
      Если ТекДата>КонДата Тогда  // упс! проскочили
         СчМес=СчМес-1; // кол. месяцев уменьшили на один
         ТекДата=ДобавитьМесяц(ТекДата,-1); // а дату вернули на месяц назад
         Прервать;
      КонецЕсли;      
   КонецЦикла;         
   СчДней=КонДата-ТекДата;
   Сообщить("Месяцев:"+СчМес+"  дней "+СчДней);
КонецПроцедуры
Показать полностью

c 01.01.08 по 31.03.08 сообщает Месяцев: 2 дней 30
c 01.01.08 по 01.04.08 сообщает Месяцев: 3 дней 0
7. Abadonna 3971 29.03.08 22:31 Сейчас в теме
А уж целочисленное деление месяцев на 12 надеюсь сделаешь сам ;)
8. lola_71 30.03.08 18:20 Сейчас в теме
> c 01.01.08 по 31.03.08 сообщает Месяцев: 2 дней 30
> c 01.01.08 по 01.04.08 сообщает Месяцев: 3 дней 0

Мне кажется, что в первом случае правильный ответ будет - 3 месяца, а во-втором - 3 месяца 1 день. Или не так?
9. CheBurator 2725 30.03.08 23:39 Сейчас в теме
все зависит от того как считать: с 01.01.08 по 02.01.08 0- сколько дней прошло? если один - тогда выше - все верно, если два - тогда надо накинуть еще день...
10. poppy 31.03.08 02:19 Сейчас в теме
Вокруг одни ламеры! ;)

c 31.01.08 по 01.02.08 сообщает Месяцев: 0 дней 3 (0/0/3),
но с 31.01.07 по 01.02.07 сообщает Месяцев: 0 дней 4 (0/0/4)
Откуда день взялся (точнее, 2-3 дня)? Похоже на машину времени... ;)

Лучше уж написать так:
Код
Процедура Сформировать()
   СчМес = 0;
   Пока ДобавитьМесяц(НачДата, СчМес + 1) <= КонДата Цикл 
      СчМес = СчМес + 1; 
   КонецЦикла;         
   СчДней = КонДата - ДобавитьМесяц(НачДата, СчМес);
   Сообщить("Месяцев:" + СчМес + "  дней " + СчДней);
КонецПроцедуры
Показать полностью
11. MishaD 14 31.03.08 20:06 Сейчас в теме
Для оптимизации можно еще добавить вместо счмес=0.

СчМес=Цел((КонДата-НачДат)/30)-1// 1 отнимаю на всякий случай
12. CheBurator 2725 31.03.08 23:55 Сейчас в теме
2 poppy: ладно я, старый дядька...
но я вот как-то считаю что
31.01.08 - 31.0.108 = 1 ден, а не ноль...
13. CheBurator 2725 01.04.08 00:07 Сейчас в теме
кстати..
ДобавитьМесяц(ДобавитьМесяц('31.01.08',1),-1) = ?????
14. CheBurator 2725 01.04.08 00:10 Сейчас в теме
вариант poppy компактный, туда только день-поправочку ввести - тому, кто как я считает что 31.01 - 01.02 = 2 дня
15. Shaman100M 1152 01.04.08 09:35 Сейчас в теме
По теме: количество полных лет между 2 датами:
Код
ЧислоПолныхЛет = Цел((Число(Формат(ДатаКон,"ДГГГГММДД")) - Число(Формат(ДатаНач,"ДГГГГММДД")))/10000); // с мисты, автора не помню
Показать полностью
16. CheBurator 2725 01.04.08 19:10 Сейчас в теме
нет, вы мне вот это поясните:
ДобавитьМесяц(ДобавитьМесяц('31.01.08',1),-1) = ?????
17. Abadonna 3971 02.04.08 07:31 Сейчас в теме
31/01/08 + месяц у всех белых людей равно 28/02/08 для не високосного или 29/02/08 для високосного (как раз в 2008)
А считать месяц 01.01.08 - 31.08.01 та же детская ошибка, как считать, что новый век и новое тысячелетие наступили в 2000-ом году
18. CheBurator 2725 02.04.08 18:31 Сейчас в теме
Какую-то фигню вы написали...
19. poppy 03.04.08 00:23 Сейчас в теме
Сhe Burashka Написал:
-------------------------------------------------------
> вариант poppy компактный, туда только
> день-поправочку ввести - тому, кто как я считает
> что 31.01 - 01.02 = 2 дня

Только ли туда? Странно, но твой алгоритм считает не так как ты... ;)

В свете поста от Shaman100M предлагаю код компактнее:
Код
   СчЛет=Цел((Число(Формат(КонДата, "ДГГГГММДД"))-Число(Формат(НачДата, "ДГГГГММДД")))/10000);
   СчМес=Цел((Число(Формат(КонДата, "ДГГГГММДД"))-Число(Формат(НачДата, "ДГГГГММДД")))/100) - СчЛет*100;
   СчДней=КонДата-ДобавитьМесяц(НачДата,СчМес+СчЛет*12);
   Сообщить("Лет: " + СчЛет + " месяцев:"+СчМес+"  дней "+СчДней);
Показать полностью


Но и он имеет недостатки.
Поэтому считаю, что использовать функцию ДобавитьМесяц для решения поставленной задачи = нецелесообразно.
20. Mucmepukc 86 03.04.08 14:29 Сейчас в теме
Код
Процедура Сформировать()
   Лет=0;    Месяцев=0; Дней=0;
   ДатаТек=Дата1;
   Пока ДобавитьМесяц(ДатаТек,1) <= Дата2 Цикл
      ДатаТек=ДобавитьМесяц(ДатаТек,1);
      Месяцев=Месяцев+1;
      Если Месяцев=12 Тогда
         Лет=Лет+1; Месяцев=0;
      КонецЕсли;      
   КонецЦикла;
        Дней=Дата2 - ДатаТек;
КонецПроцедуры 
Показать полностью
21. CheBurator 2725 04.04.08 00:39 Сейчас в теме
Поппа, не злобствуй! ;-)
у меня ошибка в строке
Дней = Дата2 - ДобавитьМесяц(ТекДата,-1);
если ее поправить правильно то получится примерно то, как у тебя написано...
.. а в последнем товем посте еще компактнее можно... на рекурсию похоже...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот