FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9145
Вход
Расчет срока между двумя датами

Имеем две даты надо знать количество лет, месяцев и дней


 
Прислал: Даниил Александрович   Категория: Инструменты разработчика


Расчет срока между двумя датами

Сталкнулся с таким думал все просто посмотрел на форуме супер сложные и умные какието предложения:

d1=начальная дата
d2=конечная дата
yy=int((d2-d1)/365.2425) && года
mm=int((d2-d1)/30.4369) && месяца
dd=(d2-GOMONTH(d1,mm)) && дни

от куда такие цыфры:
set date to germ
d1=CTOD('1.12.2000')
d2=CTOD('1.12.6000')
((d2-d1)/(YEAR(d2)-YEAR(d1)))=365.2425 && среднее число дней в году за 4000 лет
((d2-d1)/(YEAR(d2)-YEAR(d1)))/12=30.4369 && среднее число дней в месяце за 4000 лет

кому мало точности, берите больше срок будет точнее ;)


 
Сделайте оценку этого решения Плохо Удовлетворительно Так себе Хорошо Отлично Текущая оценка: (3.7)
Дополнения пользователей
Расчет срока между двумя датами
[+][?]
Анатолий
03.02.05 15:30:20

Есть хорошее решение этой проблемы - IMHO:
http://www.ita-software.com/files/Age.zip
Владимир Максимов
05.02.05 16:23:04

Вся проблема в том, что каждый по своему понимает, сколько дней и месяцев должно быть между двумя
датами.

Например, сколько дней будет между 27 января и 1 марта? Есть 2 ответа на этот вопрос: 

1 месяц и 5 дней - сначала 5 дней до 1 февраля, потом 1 месяц
1 месяц и 2 дня - сначала 1 месяц до 27 февраля, потом 2 дня

И каждый из ответов по своему правильный! Просто способ расчета зависит от конечной цели этого
самого расчета.

Вы в своем расчете фактически приняли вторую идеологию. Тот же самый расчет можно сделать и без
переводных коэффициентов. Будет на пяток строк длиннее и только.

Но! А правильно ли это? Не в смысле расчета, а в смысле конечной цели.
baddan
26.05.05 08:48:49

Позже пришел к следующему: самый точный вариант, работает мгновенно и ни каких наворотов!
 d1=CTOD('1.12.1977')
 d2=CTOD('12.4.2005')

 dd1=0 && дней
 mm1=0 && месяцев
 yy1=0 && годиков

 for mm1=0 to 999 do
  if gomo(d1,mm1)>=d2
   exit
  endif
 endfor

 dd1=d2-gomo(d1,mm1-iif(mm1>0,1,0))
 yy1=int(mm1/12)

[Дополнить]



© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика