黑马程序员技术交流社区

标题: 计算某天是星期几 [打印本页]

作者: 上帝的尊严    时间: 2013-12-3 12:36
标题: 计算某天是星期几
本帖最后由 上帝的尊严 于 2013-12-3 22:48 编辑

我在baidu上收到的是:用蔡勒公式:w=y+【y/4】+【c/4】-2c+【26(m+1)/10】+d-1
蔡勒公式只适合1582年10月15日之后的情形
  w:星期;c:世纪-1;y:年(年份的后两位数);m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看做上一年的13、14月来计算,比如2003年1月1日,要看做2002年13月1日来计算); d:日【】:代表取整,即只要整数部分。  
w除以7,余数是几就是星期几,特殊的余数为0就是星期天。

自己写完代码,在验证时,发现2011-03-08这一天时,求解的w是负数,无法求余计算,我想不明白怎么解决了


作者: Goes_By    时间: 2013-12-3 13:11
.NET提供了DateTime.DayOfWeek函数。。 直接用会简单好多
当然楼主要自己计算的话就忽略我把。。。
作者: mauleta    时间: 2013-12-3 14:13
本帖最后由 mauleta 于 2013-12-3 14:23 编辑

http://baike.baidu.com/view/739374.htm 参考基姆拉尔森计算公式。
公式是这样的  W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1) mod 7
你看我写的代码吧。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. namespace test
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. while (true)
  12. {
  13. try
  14. {
  15. Console.WriteLine("请输入(yyyy-MM-dd)格式的日期:");
  16. string date = Console.ReadLine();
  17. string[] myDate = date.Split('-');
  18. int y =Convert.ToInt32( myDate[0]);
  19. int m= Convert.ToInt32(myDate[1]);
  20. int d = Convert.ToInt32(myDate[2]);
  21. string week = "";
  22. if (m == 1 || m == 2)
  23. {
  24. y = y - 1;
  25. m = m + 12;
  26. }
  27. switch ((d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400 + 1) % 7)
  28. {
  29. case 1: week = "星期一"; break;
  30. case 2: week = "星期二"; break;
  31. case 3: week = "星期三"; break;
  32. case 4: week = "星期四"; break;
  33. case 5: week = "星期五"; break;
  34. case 6: week = "星期六"; break;
  35. case 0: week = "星期日"; break;
  36. }
  37. Console.WriteLine(date+"是" + week );
  38. Console.ReadKey();
  39. break;

  40. }
  41. catch
  42. {
  43. Console.WriteLine("日期输入的格式错误,请重新输入!");
  44. continue;
  45. }

  46. }

  47. }
  48. }
  49. }
复制代码


作者: mauleta    时间: 2013-12-3 14:16
还有一个要注意的是 当年的1,2月要当成上一年的13,14月进行计算哦。
上面代码中以下部分就是为了判断1月和2月而写的。
  1. if (m == 1 || m == 2)

  2. {

  3. y = y - 1;

  4. m = m + 12;

  5. }
复制代码


作者: 许杰    时间: 2013-12-3 22:46
本帖最后由 许杰 于 2013-12-3 22:48 编辑

用。NET提供的函数就ok了   给你我的代码参考下
enum Weekday { 星期日, 星期一, 星期二, 星期三, 星期四, 星期五,星期六 };
        static void Main(string[] args)
        {
            Console.WriteLine("请输入日期(yyyy-MM-dd)");
            string dateStr = Console.ReadLine();
            DateTime dt = Convert.ToDateTime(dateStr);
            //这个就直接可以给出是星期几了
            Weekday wd = (Weekday)dt.DayOfWeek;
            Console.WriteLine("这一天是{0}",wd);
            Console.WriteLine("这一天是这一年的第{0}天", dt.DayOfYear);
            Console.ReadLine();
        }

作者: dwgeneral    时间: 2014-5-1 11:37
W = [C/4] - 2C + y + [y/4] + [13 * (M+1) / 5] + d - 1. (12)

这个公式由世纪数减一、年份末两位、月份和日数即可算出W,再除以7,得到的余数是
几就表示这一天是星期几,唯一需要变通的是要把1月和2月当成上一年的13月和14月,
C和y都按上一年的年份取值。因此,人们普遍认为这是计算任意一天是星期几的最好的
公式。这个公式最早是由德国数学家克里斯蒂安·蔡勒(Christian Zeller, 1822-
1899)在1886年推导出的,因此通称为蔡勒公式(Zeller’s Formula)。为方便口算,
式中的[13 * (M+1) / 5]也往往写成[26 * (M+1) / 10]。

  现在仍然让我们来算2004年5月1日的星期,显然C=20,y=4,M=5,d=1,代入蔡勒
公式,有:

W = [20/4] - 40 + 4 + 1 + [13 * (5+1) / 5] + 1 - 1
= -15


注意负数不能按习惯的余数的概念求余数,只能按数论中的余数的定义求余。为了方便
计算,我们可以给它加上一个7的整数倍,使它变为一个正数,比如加上70,得到55。
再除以7,余6,说明这一天是星期六。这和实际是一致的,也和公式(2)计算所得的结
果一致。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2