robot
最新文章(10)
Mqskit 和其它相關工具
CPython 的 GC 二、三事
寫 Mecurial Extension 是件快樂的事!
Mozilla 台灣辨公室徵人啟事
關於 Apple 的兩項專利
core dump 之前的 frame
怎麼發出 beep 聲?
先承認你要找的是奴才吧!
程式碼要清的多乾淨?
FreeBSD 的 Thread-Local Storage 實作
首頁
新編
最新留言
Entries RSS
重要關鍵字(10)
coding (122)
Python (93)
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: