算法
算法如下:
基姆拉爾森計算公式(C++與VB.Net整數除法和取余運算符不同)
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7 //C++計算公式
W = (D + 2 * M + 3 * (M + 1) \ 5 + Y + Y \ 4 - Y \ 100 + Y \ 400+1) Mod 7 'VB.Net計算公式
在公式中d表示日期中的日數,m表示月份數,y表示年數。
注意:在公式中有個與其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10則換算成:2003-13-10來代入公式計算。
代碼
代碼如下:
// java code
//y-年,m-月,d-日期
string CaculateWeekDay(int y,int m, int d)
{
if(m==1||m==2) {
m+=12;
y--;
}
int week=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7;
string weekstr="";
switch(week)
{
case 1: weekstr="星期一"; break;
case 2: weekstr="星期二"; break;
case 3: weekstr="星期三"; break;
case 4: weekstr="星期四"; break;
case 5: weekstr="星期五"; break;
case 6: weekstr="星期六"; break;
case 0: weekstr="星期日"; break;
}
return weekstr;
}
// C語言代碼如下:測試的日期為2013年1月1號,結果為星期二;
#include <stdio.h>
void main()
{
int y=2013,m=1,d=1;
int w;
char *weekday[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
if (m==1 || m==2)
{
m=(m==1?13:14);
y=y-1;//此處表示把1,2月計算到上一年的13,14月<修改日期:2014.5.13 by 楊康佳>
}
w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7;
printf("%s\n",weekday[w]);
}
//C#代碼如下,測試時間2015.2.9 結果為星期一
/*
* @作者:007
* @時間:2015.2.9
* @版本:V1.0
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace class_8
{
class Program
{
static void Main(string[] args)
{
//定義時間
int year = 2015, month = 2, day = 13;
//用戶輸入
//年
Console.Write("Please input year = ");
year = Convert.ToInt32(Console.ReadLine());
Console.Write("\n");
//月
Console.Write("Please input month = ");
month = Convert.ToInt32(Console.ReadLine());
Console.Write("\n");
//日
Console.Write("Please input day = ");
day = Convert.ToInt32(Console.ReadLine());
Console.Write("\n");
//將1、2月轉換為上一年的13、14月
if (month == 1 || month == 2)
{
year = year - 1;
month = month + 12;
}
//用基姆拉爾森公式計算星期
int week = (day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year / 100 + year / 400 + 1) % 7;
Console.WriteLine("the week is {0}",week);
}
}
}
其他參考
參考
fun1(y,m,d)
{
int k;
if(m==1||m==2){m+=12;y--;}
return (int)((d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)+1)%7;
}
調試了2007,很正確的輸出了
基姆拉爾森計算公式改進
int fun_change(int year, int month, int day)
{
if(month == 1 || month == 2)
{
month += 12;
--year;
}
int week = -1;
week = (day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 -year / 100 +year / 400) % 7 + 1;
return week; // 輸出-1為錯誤
}
輸出1-7 分別代表 周一到周日,少了上述的switch語句。(已測試)