星期的計算

星期的計算是能夠計算出某一指定日期是在一週中的哪一天的一類演算法。多種數學演算法均可計算出過去或未來某一指定日期，是屬於一週中的星期幾，包括判決日法則，Babwani公式等，但其實這些演算法皆基於類似的機制相互變化而來，只是透過不同規則取得相同結果。演算法的典型應用，是計算某人的出生日期或某重大事件的發生日期，是在一週中的哪一天。簡介.差不多所有星期演算法的基礎皆可歸納如下：由以上可得知，使用同餘7表示在計算中可剔除7的倍數，如此可把7當作0、8當作1、9當作2、18當作4，如此類推。如果把星期日當作第0日，7日後亦是星期日，而第18日則會與第4日相同，為星期日後的4天，即星期四。一些演算法把所有加數先行計算，然後把7的倍數剔除，而其他演算法則在每一步皆剔除7的倍數。兩種做法皆可取，第一種做法較適用於計算機及電腦演算法中，其他則較適用於心算。熟悉這些計算方法之後，可在腦內計算出來。簡單的方法.把四個數加起來然後同餘7就是所求的星期數。這四個數分別是：C：2(3-(c mod4))或查世紀星期表Y：(y mod28+[y mod28/4])mod7或查年份星期表M：((3.4+(m-3)mod12×2.6)mod7或查月份星期表D：d mod7、或查日期星期表就是說——W=(C+Y+M+D)mod7(6+3+5+3)mod7=3，即該日是星期三，其中c=20、y=8、m=12、d=10(6+2+3+3)mod7=0，即該日是星期日，其中c=20、y=8、m=2、d=10(2+3+2+1)mod7=1，即該日是星期一，其中c=18、y=42、m=8、d=29有用的概念.同周月.同周月是指那些第一天的星期數相同的月份。例如9月與12月是同周月，因為9月1日是星期幾12月1日也必定是星期幾。顯然，只有兩個月份之間相隔整數週，或恰好相隔7的倍數天時，這兩個月才是同周月。比如在平年時，2月正好有28天，即2月與3月是同周月；而在閏年時，2月變成了29天，那麼2月與3月就不是同周月了。下-{面}-是同周月的列表：注意，5月與6月，不管是平年還是閏年，與其它任何月份都不是同周月。另外，在下-{面}-的月份查詢表中，同周月由於開始於一週中的同一天，所以它們的數字是相同的。同週年.同週年類似於同周月，是指那些第一天的星期數相同的年份。每一年的第一天都有星期一到星期日7種可能，而閏年的2月29日會改變其後日期的星期數。所以，每一年的星期構成共有14種可能。例如2023年是以星期日開始的平年，與2017年、2006年及1995年為同週年；2020年是以星期三開始的閏年，與2014年同樣開始於星期三，但與2015年同樣結束於星期四。演算法.以下演算法適用於公曆。需要注意的是，演算法中世紀、年、月的星期數都是指的該世紀、年、月第0天為星期幾，這樣的好處是在計算時只要直接將天數加上就可以了，而不必再減1。例如，1900年的第0天的星期數，即星期一。另一個需要注意的是，演算法中每一步得到的數字，都是參照特定日期得到的相對星期數，即與特定參照日相差幾個星期數。只有把所有這些數字相加，再根據已知的參照日才得到實際的星期數。演算法的基本步驟如下：將上面所有步驟的相對星期數相加，再取同餘7就是實際的星期數了。例子.如我們要計算1982年4月24日是星期幾：又一個例子，1783年9月18日是星期幾：再一個例子，2054年6月19日是星期幾：世紀星期表.格里曆1752-1799 4 c mod4=11800-1899 2 c mod4=21900-1999 0 c mod4=32000-2099 6 c mod4=02100-2199 4儒略曆0800-0899 3 c mod7=10900-0999 2 c mod7=21000-1099 1 c mod7=31100-1199 0 c mod7=41200-1299 6 c mod7=51300-1399 5 c mod7=61400-1499 4 c mod7=01500-1582 3年份星期表.01 07 12 18 "24" 102 "08" 13 19 24 203 08 14 "20" 25 3"04" 09 15 20 26 404 10 "16" 21 27 505 11 16 22 "00" 606 "12" 17 23 00 0閏年1、2月份年份y用斜體月份星期表.01月 002月 303月 304月 605月 106月 407月 608月 209月 510月 011月 312月 5日期星期表.星期一 1 01 08 15 22 29星期二 2 02 09 16 23 30星期三 3 03 10 17 24 31星期四 4 04 11 18 25星期五 5 05 12 19 26星期六 6 06 13 20 27星期天 0 07 14 21 28表格法.查星期：先找日和月的交叉數，然後在年行找到該數，對應到世紀行的數就是所求星期數。查主日字母：世紀行“日”所在的列為主日字母世紀列，年份行對應到該列的數字就是該年的主日字母，一為A、二為B、三為C、四為D、五為E、六為F、日為G。查判決日星期數：年份行的“三”對應到世紀行的數就是Doomsday。此外，主日字母。心演算法.心算時為方便記憶，一個簡單的方法就是把一年的起始日想象成3月1日而不是1月1日，這樣閏年的2月29日就變成了每年的最後一天，而不是在一年的中間。這樣，計算星期時的標準第0日就變成了2月的最後一天。下-{面}-就會看到，這樣計算時很方便記憶。判決日.這些日子在判決日法則中被稱作判決日，與心算的過程類似，可幫助計算。另一好處是1月和2月的計算也相對簡單了，只要記住1月9日星期數相同就可以了。下-{面}-列出了每個月中便於記憶的判決日：月 +5 月 -5 月 +10 月4月4日 9月5日 2月6日6月6日 11月7日8月8日 1月9日　 3月7日10月10日 　5月9日12月12日 　7月11日所以只要確定每一年的第0日是星期幾，參照上方列出的具有相同星期數的判決日，即可快速推算某天是星期幾。年數的計算.確定每一年的第0日是星期幾很簡單：例子.比如我們要計算2017年6月3日是星期幾。首先想到2000年第0日是星期二，那麼12年後的2012年是星期三，2013年是星期四，2014年是星期五，2015年是星期六，2016年是星期一，2017年第0日就是星期二。然後想到6月的判決日6月6日也是星期二，那麼3天前的6月3日就是星期六。高斯公式.格里曆：formula_1儒略曆：formula_2d = 日期m = 月數 - 2y = 年數後2位c = 世紀數- 1例子.計算2000年1月1日的星期，這一日期應視為1999年的11月1日。d = 1[2.6 x 11 - 0.2] = 28 mod 7 = 05(99 mod 4) = 5 x 3 = 15 mod 7 = 13 x 99 mod 7 = 3 x 1 = 35(19 mod 4) = 5 x 3 = 15 mod 7 = 1計算2000年12月31日的星期，這一日期應視為該年的10月31日。d = 31 mod 7 = 3[2.6 x 10 - 0.2] = 26 mod 7 = 45(0 mod 4) = 5 x 0 = 03 x 0 = 05(20 mod 4) = 5 x 0 = 0計算1777年4月30日的星期，這一日期應視為該年的2月30日。d = 30 mod 7 = 2[2.6 × 2 - 0.2] = 55(77 mod 4) = 5 × 1 = 53 × 77 mod 7 = 3 × 0 = 05(17 mod 4) = 5 × 1 = 5計算1582年10月4日的星期，這一日期應視為該年的8月4日。d = 4[2.6 × 8 – 2.2] = 45(82 mod 4) = 5 × 2 mod 7 = 33 × 82 mod 7 = 3 × 5 mod 7 = 16(15 mod 7) = 6 × 1 = 6計算BC1年1月1日的星期，這一日期應視為前一年的11月1日。d = 1[2.6 × 11 – 2.2] = 55(0-1 mod 4) = 5 × 3 mod 7 = 13 × (0-1) = -3 mod 7 = 46(0 mod 7) = 6 × 0 = 0Babwani公式.2004年11月，巴布瓦尼上發表了一種新的星期計算法。他的這種新方法相對於其它方法更簡單，而且不僅可用於計算星期數，更可以在星期、日期、月份、年份中已知任意三者時，計算剩下的未知者。公式：w = (⌊5y/4⌋ + m + d - 2(c mod 4) + 7) mod 7其中w=1=星期日c、y、和d=其它演算法m=月份星期表⌊5y/4⌋=其它公式的y+⌊y/4⌋-2(c mod 4)+7=1+6-2(c mod 4)=1+其它演算法的2(3-(c mod 4)，所以1代表的不是星期一而是星期日。蔡勒公式.在蔡勒演算法中，每一年被假設從3月開始，月份標號從3，即1995年1月被認為是1994年13月。具體的演算法是這樣的：formula_3其中w代表星期c代表世紀數減1(年份前兩位數)y代表年m代表月d代表日[ ]稱作高斯符號，代表取整，即只要整數部份。mod代表同餘