计算月末最后一天
/*
* 输入年月格式YM(如:201911),输入该月最后一天
*/
int monthEndDay(int YM)
{
int endDay;
int Y = YM / 100;
int M = YM % 100;
if (2 == M)
{
if (0 == Y % 400 || (0 == Y % 4 && 0 != Y % 100))
{
endDay = 29;
}
else
{
endDay = 28;
}
}
else if (1 == M || 3 == M || 5 == M || 7 == M || 8 == M || 10 == M || 12 == M)
{
endDay = 31;
}
else
{
endDay = 30;
}
return endDay;
}
void test() {
int ymd = 20190227;
int y = ymd / 10000;
int m = ymd / 100 % 100;
int d = ymd % 100;
cout << "ymd : " << ymd << endl;
cout << "y : " << y << endl;
cout << "m : " << m << endl;
cout << "d : " << d << endl;
int endDay = monthEndDay(y*100 + m);
cout << "endDay: " << endDay << endl;
}
增减天数
/*
* 输入年月日格式YMD(如:20191114),输入增减天数nD,返回年月日格式
*/
int AddDays(int YMD, int nD)
{
int endDay = 0;
int Y = YMD / 10000;
int D = YMD % 100;
int M = YMD / 100 % 100 ;
D += nD;
endDay = monthEndDay(Y*100 + M);
if ( nD > 0 )
{
while ( D > endDay )
{
D -= endDay;
M += 1;
if ( M > 12 )
{
Y += M / 12;
M = M % 12;
}
endDay = monthEndDay(Y*100 + M);
}
}
else
{
while (D <= 0)
{
M -= 1;
if (0 == M)
{
Y -= 1;
M = 12;
}
endDay = monthEndDay(Y * 100 + M);
D += endDay;
}
}
return (Y*100 + M) * 100 + D;
}
void test_addDay() {
int YMD = 20191114;
int addedYMD1 = AddDays(YMD, -5);
int addedYMD2 = AddDays(YMD, -16);
int addedYMD3 = AddDays(YMD, 10);
int addedYMD4 = AddDays(YMD, 18);
cout << "addedYMD1: " << addedYMD1 << endl; // 20191109
cout << "addedYMD2: " << addedYMD2 << endl; // 20191029
cout << "addedYMD3: " << addedYMD3 << endl; // 20191124
cout << "addedYMD4: " << addedYMD4 << endl; // 20191202
}
增减月份
/*
* 输入年月格式YM(如:201911),和增加和减少月数nM, 返回年月格式
*/
int addMonths(int YM, int nM)
{
if ( 0 == nM ) return YM;
int Ms = YM / 100 * 12 + YM % 100 + nM;
int Y = Ms / 12;
int M = Ms % 12;
if ( 0 == M )
{
M = 12;
Y -= 1;
}
return Y * 100 + M;
}
void test_addMonths() {
int YM = 201911;
int addedYM = addMonths(YM, 2);
cout << "addedYM: " << addedYM << endl; // 201001
}
获取下一个月
/*
* 输入年月格式YM(如:201911), 返回年月格式,根据当前月推算下月
*/
int nextMonth(int YM)
{
int Y = YM / 100;
int M = YM % 100;
if (12 == M)
{
M = 1;
Y = Y + 1;
}
else
{
M = M + 1;
}
return (Y * 100 + M);
}
void test_nextMonth() {
int YM = 201912;
int next_month = nextMonth(YM);
cout << "next_month: " << next_month << endl; // 202001
}
计算weekDay
// 返回 0-6 分别代表周一到周日
int calcWeekDay(int ymd)
{
int y = ymd / 10000;
int m = ymd / 100 % 100;
int d = ymd % 100;
// 此处表示把1,2月计算到上一年的13,14月
if (m == 1 || m == 2) {
m += 12;
y--;
}
// 基姆拉尔森计算公式
int week = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;
return week;
}