簡易手工萬年曆
- 詳細內容
- 分類:Javascript
- 發佈:2012-12-07, 週五 23:23
- 點擊數:10613
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的弔詭