|
![]() |
#1 |
Участник
|
08.12.2006 - 09.11.2006
Результат: distance is 0 year(s), 1 month(s) and -1 day(s) С уважением, itfs. |
|
![]() |
#2 |
Участник
|
Цитата:
![]() 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)); PHP код:
Последний раз редактировалось gl00mie; 10.11.2006 в 12:20. |
|
|
За это сообщение автора поблагодарили: itfs (1). |
![]() |
#3 |
Moderator
|
![]()
Даа... Насколько компактнее и прозрачнее получается алгоритм на VBA при использовании функции DateAdd:
Код: Sub VBA_TestDifferenceBetweenTwoDates() Dim dateBeg As Date, dateEnd As Date, dateTest As Date Dim y1 As Integer, m1 As Integer, y2 As Integer, m2 As Integer Dim ys As Integer, ms As Integer, ds As Integer dateBeg = DateSerial(2006, 1, 31) dateEnd = DateSerial(2006, 4, 30) y1 = Year(dateBeg): m1 = Month(dateBeg) y2 = Year(dateEnd): m2 = Month(dateEnd) ms = (y2 * 12 + m2) - (y1 * 12 + m1) 'предварительная разница в месяцах dateTest = DateAdd("m", ms, dateBeg) 'пробная дата на ms месяцев от начала ds = DateDiff("d", dateTest, dateEnd) 'предварит-ная разница в днях 'в пределах последнего месяца (+/-) If ds < 0 Then 'ЕСЛИ предварит-но "перебрали" с целыми месяцами от начала ms = ms - 1 'ТО окончат-ная разница в месяцах dateTest = DateAdd("m", ms, dateBeg) 'новая "пробная" дата ds = DateDiff("d", dateTest, dateEnd) 'окончательная разница в днях (+) End If ys = ms \ 12: ms = ms Mod 12 'годы - тривиально от месяцев Debug.Print ys, ms, ds '<- Годы, Месяцы, Дни разницы соответственно 'или еще и недели внутри месяца :-) Debug.Print ys, ms, ds \ 7, ds Mod 7 '<- Годы, Месяцы, Недели, Дни разницы End Sub А вот есть ли в Аксе приемлемый аналог функции DateAdd ? P.S. 30.01.07 Как выяснилось здесь, для месяцев - есть. В Global, называется dateMthFwd. |
|