一:常用公式
W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D
Y是年份數,D是這一天在這一年中的累積天數,也就是這一天在這一年中是第幾天。
二:蔡勒(Zeller)公式
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
公式中的符号含義如下,w:星期;c:世紀;y:年(兩位數); m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月來計算,比如2003年1月1日要看作2002年的13月1日來計算);d:日;[ ]代表取整,即隻要整數部分。
相比于通用通用計算公式而言,蔡勒(Zeller)公式大大降低了計算的複雜度。
三:對蔡勒(Zeller)公式的改進
相比于另外一個通用通用計算公式而言,蔡勒(Zeller)公式大大降低了計算的複雜度。不過,筆者給出的通用計算公式似乎更加簡潔(包括運算過程)。現将公式列于其下:
W=[y/4]+r (y/7)-2r(c/4)+m’+d
公式中的符号含義如下,r ( )代表取餘,即隻要餘數部分;m’是m的修正數,現給出1至12月的修正數1’至12’如下:(1’,10’)=6;(2’,3’,11’)=2;(4’,7’)=5;5’=0;6’=3;8’=1;(9’,12’)=4(注意:在筆者給出的公式中,y為潤年時1’=5;2’=1)。其他符号與蔡勒(Zeller)公式中的含義相同。
四:基姆拉爾森計算公式
這個公式名稱是我給命名的,哈哈希望大家不要見怪。
W= (d+2m+3(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日數,m表示月份數,y表示年數。
注意:在公式中有個與其他公式不同的地方:
Code
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
// ************************************************
// str_week
//
/// <summary>
/// 傳回謀年某月任意一天是星期幾的描述
/// </summary>
//y:年,m:月,d:日。在參數都隻傳入相應的整數
// ********************************************/
string str_week(int y,int m,int d){
int a=7; // 用來儲存計算得到的星期幾的整數
string str_date="";
if((m==1)||(m==2))//如果是一月或二月進行換算
{
m+=12;
y--;
}
a=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; //得到的星期幾的整數
switch (a){
case 0:
str_date="星期一";
break;
case 1:
str_date="星期二";
break;
case 2:
str_date="星期三";
break;
case 3:
str_date="星期四";
break;
case 4:
str_date="星期五";
break;
case 5:
str_date="星期六";
break;
case 6:
str_date="星期日";
break;
}
return str_date;
}
int main()
{
int y, m, d;
cout << "輸入日期:如 2012-03-30" << endl;
scanf("%d-%d-%d", &y, &m,&d);
cout << str_week(y, m, d) << endl;
}