蔡勒公式
众所周知,蔡勒公式在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;
}