|
|
|
|
#1 |
|
Moderator
|
Никто и не предлагает этим заниматься. Для получения полного количества месяцев надо умножить полное кол-во лет (элемент 1 контейнера) на 12 и добавить месяцы неполного года (элемент 2).
Я просто выдаю все те величины, которые, как правило, не могут быть получены тривиальным путем, оставляя выбор пользователю функции выполнять заключительные тривиальные действия. Например, для получения общего количества недель срока надо всего лишь общее кол-во дней (элемент 6) разделить на 7. И т.п. Цитата:
|
|
|
|
|
#2 |
|
Участник
|
Ок. Я неправильно выразился.
Получать число месяцев из функции, которая тратит время и на расчет числа дней... Это тоже изврат. Хотя и не такой, как расчет через цикл. Что касается расчета месяцев... Там предлагается: 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;
} |
|
|
|
|
#3 |
|
Участник
|
Цитата:
Сообщение от 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;
} |
|
|
|
|
#4 |
|
Участник
|
Цитата:
Сообщение от 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;
} |
|
|
| Теги |
| дата |
|
|
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|