日時計算プログラム②
閏年を考慮した日時計算プログラムを何度かに分けて載せる予定です。
(中身は、むかしANCI-Cで書いたコードをC++クラスで囲っただけです)
今回は日付調整部
//—————————————————————————–
// 1.関数名 : AdjustMonth
// 2.機能 : 年月の調整
// 3.引数 : lYmd 年月日
// : lAdjust 調整月数
// : cFlg 調整方向
// : ‘+’ or ‘-‘
// 4.戻り値 : 調整後の年月日
//—————————————————————————–
long CAdjustDate::AdjustMonth(int _year, int _month, int _day, int _lAdjust, char _cFlg)
{
return AdjustMonth(_year * 10000 + _month * 100 + _day, _lAdjust, _cFlg);
}
long CAdjustDate::AdjustMonth(long lYmd, long lAdjust, char cFlg)
{
long lYy;
long lMm;
long lDd;
long lTmp;
long lEndDay;
lDd = (lYmd % 100L);
lTmp = (lYmd – lDd) / 100L;
lMm = (lTmp % 100L);
lYy = (lTmp – lMm) / 100L;
lEndDay = (long)GetMonthEndDay((int)lYy, (int)lMm);
if (cFlg == ‘+’) {
// nヶ月後へ調整
lTmp = lYy * 12L + lMm + lAdjust;
lMm = lTmp % 12L;
if (lMm == 0L) {
lMm = 12L;
}
lYy = (lTmp – lMm) / 12L;
}
else {
// nヶ月前へ調整
lTmp = lYy * 12L + lMm – lAdjust;
lMm = lTmp % 12L;
if (lMm == 0L) {
lMm = 12L;
}
lYy = (lTmp – lMm) / 12L;
}
lTmp = (long)GetMonthEndDay((int)lYy, (int)lMm);
// 末日の場合の調整
if ((lDd == lEndDay) || (lDd > lTmp)) {
// 入力日が末日のとき、または、入力日が調整後年月の末日以上のとき
lDd = lTmp; // 出力日を末日にする
}
return (lYy * 10000 + lMm * 100 + lDd);
}
//—————————————————————————–
// 1.関数名 : AdjustDay
// 2.機能 : 年月日の調整
// 3.引数 : lYmd 年月日
// : lAdjust 調整日数
// : cFlg 調整方向
// : ‘+’ or ‘-‘
// 4.戻り値 : 調整後の年月日
//—————————————————————————–
long CAdjustDate::AdjustDay(int _year, int _month, int _day, int _lAdjust, char _cFlg)
{
return AdjustDay(_year * 10000 + _month * 100 + _day, _lAdjust, _cFlg);
}
long CAdjustDate::AdjustDay(long lYmd, long lAdjust, char cFlg)
{
long lYy;
long lMm;
long lDd;
long lTmp;
long lEndDay;
long lEndTmp;
lDd = (lYmd % 100L);
lTmp = (lYmd – lDd) / 100L;
lMm = (lTmp % 100L);
lYy = (lTmp – lMm) / 100L;
lEndDay = (long)GetMonthEndDay((int)lYy, (int)lMm);
if (cFlg == ‘+’) {
// n日後へ調整
lEndTmp = lEndDay – lDd;
while (lEndTmp < lAdjust) {
lAdjust -= lEndTmp; // 現月分を減算
lYmd = AdjustMonth(lYmd, 1L, '+'); // 翌月へ
lDd = (lYmd % 100L);
lTmp = (lYmd – lDd) / 100L;
lMm = (lTmp % 100L);
lYy = (lTmp – lMm) / 100L;
lEndTmp = (long)GetMonthEndDay((int)lYy, (int)lMm);
lDd = 0L;
}
lDd = lDd + lAdjust;
}
else {
// n日前へ調整
lEndTmp = lDd;
while (lEndTmp <= lAdjust) {
lAdjust -= lEndTmp; // 現月分を減算
lYmd = AdjustMonth(lYmd, 1L, '-'); // 前月へ
lDd = (lYmd % 100L);
lTmp = (lYmd – lDd) / 100L;
lMm = (lTmp % 100L);
lYy = (lTmp – lMm) / 100L;
lEndTmp = (long)GetMonthEndDay((int)lYy, (int)lMm);
}
lDd = lEndTmp – lAdjust;
}
return (lTmp = lYy * 10000 + lMm * 100 + lDd);
}