蔡勒公式和吉姆拉尔森公式计算星期几

蔡勒公式

众所周知,蔡勒公式在1582.10.4号之前和之后是不同的.
这不是为了调整计算上的误差.
而是历史上1582年10月更改历法,这一个月从4号跳到了15号,所以公式需要修改.
但是大部分时候,计算机不会考虑这个事情(甚至大部分日历软件无法查询1900年以前的日子,有的话1582年也大多是错误的).
所以我们可以把蔡勒公式的前面一段无视.

int week(int y, int m, int d) {
			if(m < 3) {m += 12, y -= 1;}
			// 1582年10月4日或之前
			// int w = (d + 1 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 + 5) % 7;
			// 1582年10月4日后
			int w = (d + 1 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;
			return (w + 7) % 7;
		}

吉姆拉尔森公式

int week(int y, int m, int d)
		{
			if (m < 3) {m += 12;y--;}
			int w = (d + 2*m + 3*(m + 1)/5 + y + y/4 - y/100 + y/400 + 1) % 7;
			return w;
		}

判断日期是否合法

bool check_date(int y, int m, int d) {
	if(1 <= m && m <= 12) {
		if(m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) return 1 <= d && d <= 31;
		else if(m == 2 && ((y % 100 != 0 && y % 4 == 0) || y % 400 == 0)) return 1 <= d && d <= 29;
		else if(m == 2) return 1 <= d && d <= 28;
		else return 1 <= d && d <= 30;
	}
	return false;
}
原文地址:https://www.cnblogs.com/zzidun-pavo/p/13160962.html