簡易手工萬年曆
- 詳細內容
- 分類:Javascript
- 發佈:2012-12-07, 週五 23:23
- 點擊數:6201
javascript 手工製作萬年曆---不使用Date物件
不論是在學哪種程式語言,好像都會有人問這個問題。
這大概是某種形式的作業吧!~(算芭樂作業嗎@@??)..
或許是因為他有點小複雜的邏輯性,讓他變成了經典作業了!(好吧 是經典 不是芭樂!!~)
寫這篇是因為在奇摩知識+看到了這問題,勾起了以前學C的回憶~
既然現在在學javascript~那就用javascript也來寫一個吧!~
要寫手工萬年曆 (校稿時發現我打成狗公==" ),要先知道幾件事情。
1. 西元1年1月1日是星期一
2.每四年的2月有29天
3.每100年的2月是28天
4.每400年的2月又變成29天
好吧!~這就是我剛剛說的有點小複雜的邏輯..
要做出指定月份的月曆要知道2件事:
1.當月份的1號是星期幾
2.當月份有幾天
要知道當月份1號是星期幾 就要算出從西元1月1日到前一月底總共過了幾天。
當月份有幾天就簡單了,麻煩是要知道2月在那一年是28天還是29天。
簡易的意思就是,很陽春...還是直接來看程式吧:
<html> <head> <script type="text/javascript"> var week = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] function ca() { inputs = document.getElementsByTagName("input"); var year = inputs[0].value; var month = inputs[1].value; var reg = /^[0-9]*$/; if(!reg.test(year) || year == 0) {//檢查年份輸入 alert("年份請輸入正整字"); return false; }; if(!reg.test(month) || month == 0 || month > 12) {//檢查月份輸入 alert("月份請輸入1-12數字"); return false; } //算出當月份1號是星期幾 var firstday = getfirstday(year, month); //算出表格需要的列數 是因為有標題列日 一...... var rows = Math.ceil((week[month - 1] + firstday) / 7) + 1; var tb = document.getElementById("tb"); //輸出表格與結果 tb.style.border = "1 solid #000000"; if(tb.rows.length == 0) { row1 = tb.insertRow(-1); row1.insertCell(-1).innerHTML = "日"; row1.insertCell(-1).innerHTML = "一"; row1.insertCell(-1).innerHTML = "二"; row1.insertCell(-1).innerHTML = "三"; row1.insertCell(-1).innerHTML = "四"; row1.insertCell(-1).innerHTML = "五"; row1.insertCell(-1).innerHTML = "六"; } //製作表格與輸出 tb_rows = tb.rows.length; while(tb_rows > 1) { tb.deleteRow(-1); tb_rows--; } for( i = 1; i < rows; i++) { rown = tb.insertRow(-1); for( j = 1; j < 8; j++) { rown.insertCell(-1); } } cells = tb.cells; for( i = (firstday), j = 1; j <= week[month - 1]; i++, j++) { cells[i + 7].innerHTML = j; } return false; } function getfirstday(year, month) { //算出到前一年底種共過了幾天 var alldays = (year - 1) * 365 + parseInt((year - 1) / 4) alldays -= parseInt((year - 1) / 100); alldays += parseInt((year - 1) / 400); //算出當年2月份的天數 if((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0))) { week[1] = 29; } else { week[1] = 28; } //算出到前一月底總共過了幾天 for( i = 0; i < (month - 1); i++) { alldays += week[i]; } //當月1號 除以7取餘數的星期幾 0=星期日 day = (alldays + 1) % 7; return day; } </script> </head> <body> <form onsubmit="return ca();"> <input type="text"/> <input type="text"/> <input type="submit"/> </form> <table id="tb"></table> </body> </html>
臨時寫的 不知道有沒有啥特別問題,有bug請不吝惜通知我,十分感激。
我真該換個編輯器了 字都混再一起看...真不優..
後記:
我後來查了一下 西元1年1月1日星期一這東西真的是推出來了。
跟當年的1月1日可能不會是同一天。
因為在1582年10月15日前 曆法的計算公式並不是這樣...
下面是轉貼至中央研究院計算中心 兩千年中西曆轉換...
當代的西曆稱為格理哥里(Gregorian)曆,由教皇格理哥里十三世頒行,於1582年10月15日啟用。在此之前的西曆稱為儒略(Julian)曆,規則很簡單,年份每逢4的倍數就為閏年,唯一的例外是西元4年停閏。儒略曆的精度不足,教皇格理哥里十三世在位時,日數誤差已達10日。所以格理哥里改革曆法,增加逢百年不閏但逢四百年要閏的規則,並修正日數,使儒略曆1582年10月4日的次日變成格理哥里曆1582年10月15日。天主教國家迅速接受新曆法,大英帝國遲至1752年9月14日才接受,俄國更晚至革命後才於1918年採行。使用者可選擇或自訂西曆改曆日期。
如果你覺得寫的還不錯,請給我一個讚喔!!
按個讚!~支持本站!~
你可能會有興趣的文章
- javascript 基礎資料型態(字串 數值 布林)
- javascript 變數與常數
- javascript 初體驗..
- javascript 利用setTimeout(setInterval) 做個簡易計時器
- javascript 邏輯運算子 || (OR) 跟 &&(AND) 的傳回值不只是true
- javascript onload 都不onload了- 淺談onload的弔詭