Участник
Регистрация: 28.11.2005
Адрес: Москва
|
Цитата:
Сообщение от itfs
08.12.2006 - 09.11.2006
Результат:
distance is 0 year(s), 1 month(s) and -1 day(s)
Да, точно все оказалось несколько сложнее... Вот чуть измененный вариант именования количества периодовX++: // возвращает строку "кол-во периодов"
static str PeriodSklInt(IntvScale _period, int _count)
{
str _s;
;
if (!_count) return "";
if (_count < 0) _count = -_count;
if ((_count mod 100<10 || _count mod 100>20) && _count mod 10==1)
switch (_period)
{
case IntvScale::Day : _s = "день"; break;
case IntvScale::Week : _s = "неделя"; break;
case IntvScale::Month : _s = "месяц"; break;
case IntvScale::Quarter : _s = "квартал"; break;
case IntvScale::Year : _s = "год"; break;
default : _s = "период"; break;
}
else if ((_count mod 100<10 || _count mod 100>20) && _count mod 10>1 && _count mod 10<=4)
switch (_period)
{
case IntvScale::Day : _s = "дня"; break;
case IntvScale::Week : _s = "недели"; break;
case IntvScale::Month : _s = "месяца"; break;
case IntvScale::Quarter : _s = "квартала"; break;
case IntvScale::Year : _s = "года"; break;
default : _s = "периода"; break;
}
else
switch (_period)
{
case IntvScale::Day : _s = "дней"; break;
case IntvScale::Week : _s = "недель"; break;
case IntvScale::Month : _s = "месяцев"; break;
case IntvScale::Quarter : _s = "кварталов"; break;
case IntvScale::Year : _s = "лет"; break;
default : _s = "периодов"; break;
}
return strfmt("%1 %2",_count, _s);
} а вот подправленная функция расчета интервалаX++: static str myDateDiff(date _d1, date _d2, boolean _include = false)
{
date m_d1, m_d2; // m_d2 >= m_d1
str _s;
int m_year, m_mth, m_days;
;
if(_d1<_d2)
{
m_d1 = _d1;
m_d2 = _d2;
} else
{
m_d1 = _d2;
m_d2 = _d1;
}
m_year = yearDiff(m_d2,m_d1);
m_mth = mthOfYr(m_d2) - mthOfYr(m_d1);
if (m_mth < 0)
m_mth += 12;
m_days = dayOfMth(m_d2) - dayOfMth(m_d1);
if (m_days < 0)
{
m_mth--;
m_days += dayOfMth(dateEndMth(m_d1));
}
if (m_mth < 0)
m_mth += 12;
if (_include) m_days++;
if (m_days == dayOfMth(dateEndMth(m_d2)))
{
m_mth++;
m_days = 0;
}
_s = strltrim(strrtrim(strfmt("%1 %2 %3", PeriodSklInt(IntvScale::Year, m_year),
PeriodSklInt(IntvScale::Month, m_mth),
PeriodSklInt(IntvScale::Day, m_days))));
return _s;
} Теперь следующий кодX++: info("distance is " + myDateDiff(10\09\2005, 01\10\2006));
info("distance is " + myDateDiff(10\10\2005, 09\10\2006));
info("distance is " + myDateDiff(31\01\2005, 29\04\2006));
info("distance is " + myDateDiff(31\01\2005, 30\04\2006));
info("distance is " + myDateDiff(31\01\2005, 01\05\2006));
info('---------------------------');
info("distance is " + myDateDiff(31\01\2004, 27\02\2004));
info("distance is " + myDateDiff(31\01\2004, 28\02\2004));
info("distance is " + myDateDiff(31\01\2004, 29\02\2004));
info("distance is " + myDateDiff(31\01\2004, 01\03\2004)); выдает в infolog
PHP код:
distance is 1 год 21 день
distance is 11 месяцев 30 дней
distance is 1 год 2 месяца 29 дней
distance is 1 год 3 месяца
distance is 1 год 3 месяца 1 день
---------------------------
distance is 27 дней
distance is 28 дней
distance is 1 месяц
distance is 1 месяц 1 день
Последний раз редактировалось gl00mie; 10.11.2006 в 12:20.
|