计算月末最后一天
/
输入年月格式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(y100 + 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(Y100 + M);
if ( nD > 0 )
{
while ( D > endDay )
{
D -= endDay;
M += 1;
if ( M > 12 )
{
Y += M / 12;
M = M % 12;
}
endDay = monthEndDay(Y100 + M);
}
}
else
{
while (D <= 0)
{
M -= 1;
if (0 == M)
{
Y -= 1;
M = 12;
}
endDay = monthEndDay(Y 100 + M);
D += endDay;
}
}
return (Y100 + 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 //代码效果参考:http://www.lyjsj.net.cn/wz/art_23204.html
% 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 //代码效果参考:http://www.lyjsj.net.cn/wx/art_23194.html
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;
}