簡易手工萬年曆

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日前 曆法的計算公式並不是這樣...

下面是轉貼至中央研究院計算中心 兩千年中西曆轉換...

http://sinocal.sinica.edu.tw/

當代的西曆稱為格理哥里(Gregorian)曆,由教皇格理哥里十三世頒行,於1582年10月15日啟用。在此之前的西曆稱為儒略(Julian)曆,規則很簡單,年份每逢4的倍數就為閏年,唯一的例外是西元4年停閏。儒略曆的精度不足,教皇格理哥里十三世在位時,日數誤差已達10日。所以格理哥里改革曆法,增加逢百年不閏但逢四百年要閏的規則,並修正日數,使儒略曆1582年10月4日的次日變成格理哥里曆1582年10月15日。天主教國家迅速接受新曆法,大英帝國遲至1752年9月14日才接受,俄國更晚至革命後才於1918年採行。使用者可選擇或自訂西曆改曆日期。

smiley如果你覺得寫的還不錯,請給我一個讚喔!!smiley

 
 

  按個讚!~支持本站!~

FB推薦載入中  

你可能會有興趣的文章