robot
最新文章(10)
快樂的小成就
Pythonkey 計劃
Mqskit 和其它相關工具
CPython 的 GC 二、三事
寫 Mecurial Extension 是件快樂的事!
Mozilla 台灣辨公室徵人啟事
關於 Apple 的兩項專利
core dump 之前的 frame
怎麼發出 beep 聲?
先承認你要找的是奴才吧!
首頁
新編
最新留言
Entries RSS
重要關鍵字(10)
coding (122)
Python (91)
FreeBSD (71)
WEB (61)
URL (48)
hardware (46)
javascript (36)
Linux (34)
blog (30)
C++ (16)
所有關鍵字
新增 URL
西洋萬年曆
by thinker
2 Columns
關鍵字:
coding
萬年曆
西洋年兮曆法,有幾次兮變掛。一開始,是每四年一潤。但是四年一潤並無正確, 正球公轉一年是 365.2422 日,而四年一潤,平均一年是 365.25 日。這一點差別,經過千年兮疊積,造成曆法的誤差。每年差 0.0078 日,看起是真少,但疊積一千年就有 7.8 日。到 1582 年時,就差 12.339599... 日。因為曆法差相多天,所以 Pope Gregory XIII 建議佇咧 1582 年兮 10 月 4 號之後,將日子加十天,也就是 1582 年兮 10 月 5 號到 10 月 14 號無去,直接對 4 號跳到 15 號。加十天之後用兮曆法,叫 Gregorian 曆(Gregorian Calendar),之前叫 Julian 曆(Julian Calendar)。Julian 和 Gregorian 之間除了日子無連續,禮拜是連續兮。10 月 4 日號 Julian 兮禮拜四,10 月 15 號是 Gregorian 兮禮拜五。 Julian dates 是用天數來算兮,和 Julian Calendar 無同。 Julian dates 是相對于西元前 4713 年兮 1 月 1 號正午 12:00 兮天數,格林威治時間(UT)西元 1582 年 10 月 4 號透早 12 點(0 點)就是 2299159.5 JD。 1582 年 10 月 4 號透早 12 點(0 點) 也就是 2299160.5 JD。JD 是 Julian dates 兮縮寫。 Julian 兮曆法是,每四年一潤,也就是 2 月是 29 天,一般年是 28 天。而 Gregorian 兮曆法是每四年一潤,但是遇百年不潤,如果是四百年兮倍數,就要潤。所以 Gregorian 每四百年有 97 個潤年,四百年攏總 365 * 400 + 97 天,平均一年 365.24250000000001 天,一年誤差 0.0003,更加接近地球公轉兮平均速度。 Greograin 兮曆法並不馬上被世界各國接受,像 UNIX 頂頭 cal 這兮程式用兮是 England 的習慣,對 1752 年兮 9 月 2 號之後,才開始實施, 9 月 2 號後面接兮是 9 月 14 號,中方有 11 天無佇兮。 因此,咱若要知也某一日是禮拜幾,可以將之換算成相對於西元 1 年 1 月 1 日是幾天。西元 1 年 1 月 1 日是禮拜 6, 只要知影差幾個禮拜擱幾天,就算出禮拜幾。算法是: # 先將日子用 Julian Calendar 算換成相對天數,也就是: 天數=(舊年*365+floor(舊年/4)) # 若是日子佇 1752 年 9 月 2 號之後,要減掉 Greograin Calendar 兮差異天數: 天數=(天數 -10-floor((舊年-1600)/100)+floor((舊年-1600)/400)) # 月開始日 = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 } # 潤月開始日 = { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } # 若是一般年: 天數=天數+月開始日[西元月-1]+西元日-1 # 若是潤年: 天數=天數+潤月開始日[西元月-1]+西元日-1 # 禮拜=(天數 + 6)%7 舊年也就是今年兮年份減一,假使今年是 2005 年,舊年就是 2004。咱之所以減 10 天,是因為 Greograin Calendar 佇 1582 年 10 月份,跳過 10 天。 Javascript 兮寫法: {{{ var mondays = Array(0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365); var mondays_l = Array(0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366); function gcswitch(y, m, d) { return (y > 1752) || (y == 1752 && (m > 9 || (m ==9 && d > 2))); } function isleap(y) { if(!gcswitch(y, 1, 1)) { return y % 4 == 0; } else { return (((y % 4) == 0) && ((y % 100) != 0)) || ((y % 400) == 0); } } function get_day_of_week(y, m, d) { var nd; var im, id; /* internal representation */ var ly; /* last year */ im = m - 1; /* 0 ~ 11 */ id = d - 1; /* 0 ~ 30 */ ly = y - 1; /* last year */ nd = ly * 365 + Math.floor(ly / 4); if(gcswitch(y, m, d)) nd = nd - 10 - Math.floor((ly - 1600) / 100) + Math.floor((ly - 1600) / 400); if(!isleap(y)) nd = nd + mondays[im] + id; else { nd = nd + mondays_l[im] + id; } return (nd + 6) % 7; } }}} get_day_of_week() 傳回 0~6,代表禮拜日到禮拜六。 相關資料: * http://aa.usno.navy.mil/data/docs/JulianDate.html * http://www.tondering.dk/claus/calendar.html * http://wp.netscape.com/eng/mozilla/3.0/handbook/javascript/ * attach:calendar27.txt
最後更新時間: 2005-03-06 12:58:51 CST |
引用
查詢:
COMMENTS: