天天看點

計算任何一天是星期幾的幾種算法

一:常用公式

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+2​m+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;
}