|
![]() |
#1 |
Участник
|
Ок. Я неправильно выразился.
Получать число месяцев из функции, которая тратит время и на расчет числа дней... Это тоже изврат. Хотя и не такой, как расчет через цикл. Что касается расчета месяцев... Там предлагается: X++: ms = ( year(dtEnd) * 12 + mthOfYr(dtEnd) )
- ( year(dtBeg) * 12 + mthOfYr(dtBeg) ); // предварительная разница в месяцах ![]() Другое дело, что там учитываются полные месяцы. Т.е. тот алгоритм выдаст 0 полных месяцев для дат 21.01.09, 18.08.09 (день месяца даты начала больше дня месяца даты окончания), а мой алгоритм выдаст 1 месяц. Но если надо учитывать полные месяцы, то опять же лучше избегать вычисления разницы между датами. сделать так: X++: { Date dateFrom = 01\06\1995; Date dateTo = 01\04\2008; int years = year(dateTo) - year(dateFrom); int month = mthofyr(DateTo) - mthofYr(dateFrom); int month_correction = dayofmth(DateFrom) > dayofmth(DateTo) ? sign(DateFrom - DateTo) : 0; return ((years * 12) + month + month_correction; } |
|
![]() |
#2 |
Участник
|
Цитата:
Сообщение от mazzy
![]() Но если надо учитывать полные месяцы, то опять же лучше избегать вычисления разницы между датами. сделать так: X++: { Date dateFrom = 01\06\1995; Date dateTo = 01\04\2008; int years = year(dateTo) - year(dateFrom); int month = mthofyr(DateTo) - mthofYr(dateFrom); int month_correction = dayofmth(DateFrom) > dayofmth(DateTo) ? sign(DateFrom - DateTo) : 0; return ((years * 12) + month + month_correction; } X++: { Date dateFrom = 01\06\1995; Date dateTo = 01\04\2008; int years = year(dateTo) - year(dateFrom); int month = mthofyr(DateTo) - mthofYr(dateFrom); int month_correction = (DateFrom == DateTo) ? 0 : (dayofmth(DateFrom) > dayofmth(DateTo) ? sign(DateFrom - DateTo) : 0); return ((years * 12) + month + month_correction; } |
|
![]() |
#3 |
Участник
|
Цитата:
Сообщение от mazzy
![]() А блин... В Аксапте sign какой-то странный. Он выдает только два значения +1 или -1. Правильный код с учетом этой багофичи:
X++: { Date dateFrom = 01\06\1995; Date dateTo = 01\04\2008; int years = year(dateTo) - year(dateFrom); int month = mthofyr(DateTo) - mthofYr(dateFrom); int month_correction = (DateFrom == DateTo) ? 0 : (dayofmth(DateFrom) > dayofmth(DateTo) ? sign(DateFrom - DateTo) : 0); return ((years * 12) + month + month_correction; } X++: { Date dateFrom = 01\06\1995; Date dateTo = 01\04\2008; int years; int month; int month_correction; if(DateFrom == DateTo) return 0; years = year(dateTo) - year(dateFrom); month = mthofyr(DateTo) - mthofYr(dateFrom); month_correction = dayofmth(DateFrom) > dayofmth(DateTo) ? sign(DateFrom - DateTo) : 0; return ((years * 12) + month + month_correction; } |
|
Теги |
дата |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|