找到给定年份第0天的星期几的最简单算法是什么?

Don*_*e H 10 algorithm calendar date

我想弄清楚某一年零日(1月1日)的一周中的哪一天.

到目前为止,我已经查看了维基百科页面" 计算星期几 ",但我想知道如果你只是想找到零日,那么是否有最简单的算法.

Mar*_*som 15

这是一个简单的单线程.我使用Excel验证了1901-2200的所有年份,使用Python的1582-3000验证了这一点datetime.

dayOfWeek = (year*365 + trunc((year-1) / 4) - trunc((year-1) / 100) +
             trunc((year-1) / 400)) % 7
Run Code Online (Sandbox Code Playgroud)

这将给出星期几为0 =星期日,6 =星期六.通过在模7之前或之后添加常量可以很容易地调整此结果.例如,为了匹配Python的约定0 = Monday,在模数之前加6.


小智 9

int dayofweek(y, m, d)      /* 0 = Sunday */
int y, m, d;                /* 1 <= m <= 12,  y > 1752 or so */
{
    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;
}
Run Code Online (Sandbox Code Playgroud)

  • @jacanterbury:1752年是英国领土(例如现在的美国)从朱利安历法转换为格里高利历法,在此过程中损失了11天(9月3日至13日)。早在1584年(从记忆开始),世界其他地区就发生了变化,直到20世纪(这就是为什么在世界上大多数其他地区,俄罗斯的十月革命于11月发生的原因)之前,世界上的其他地方才发生了变化,并且有很多不同的地方日期之间。您甚至可以发现,由于切换(以及切换过程中的错误),瑞典于1712年2月30日发生了错误。 (2认同)

Zac*_*ena 8

大多数语言都提供了表示和操作日期的工具......我会依赖它们而不是实现一些(可能是不完整的)算法.

  • 如果用户要求算法,说"使用现有实现"并不是正确的答案. (2认同)

Joe*_*ger 0

岁月以28年为一个周期重复。将年份除以 28 并返回相应的星期几(星期几值存储在数组/向量中)。这将是最快且最简单的算法。但对于阅读代码的人来说,这个算法根本就不清楚。您的选择取决于您想要快速、简单还是“明显正确”。

  • 能被 100 整除的年份只有能被 400 整除的才是闰年。因此 2000 年和 2400 年是闰年,但 1900 年和 2100 年则不是。 (2认同)