简单分析Tomohiko Sakamoto的dayofweek代码

本文分析了Tomohiko Sakamoto提供的计算星期几的代码,该算法考虑了日期、月份、年份以及闰年的影响。通过常数组隐藏了算法细节,使得代码简洁优雅。
摘要由CSDN通过智能技术生成

[C FAQ]20.27 由一个日期, 怎样知道是星期几?

用mktime() 或localtime() (参见问题13.11 和13.12, 如果tm hour 的值位0,要注意DST (夏时制) 的调整); 或者Zeller 的congruence (参阅sci.math FAQ); 或者这个由Tomohiko Sakamoto 提供的优雅的代码:

int dayofweek(int y, int m, int d) /* 0 = Sunday */
{
    static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
    y -= m < 3;
    return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}

参见问题13.12 和20.28。
参考资料: [ISO, Sec. 7.12.2.3]。

简单分析:

  1. 公元一年一月一日为星期一(现在世界各国通用一星期七天的制度。这个制度最早由君士坦丁大帝[Constantine the Great]制定。他在公元321年3月7日正式宣布7天为1周,这个制度一直沿用至今)。
  2. 算今天到公元一年一月一日有多少天,%7,一周7天,周而复始。
  3. 每年365天,365=52*7+1,所以,过一年,在算星期的时候,就相当于多了一天。
  4. 闰年多一天。过一个闰年,在3月及以后就要多加一
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值