六耀の計算について(2)

今回も引き続きカレンダーに関する情報です。
前回の内容で六曜を算出するには太陰暦が必要ということがわかりました。
じゃあ調べようということで太陰暦について調べました。

・・・中々複雑なものですねぇ、正直な話、この先十年分のデータを登録しておくほうが現実的な気もします。(笑)
まぁ、なにはともあれ今回は調べて中では一般的?な天保暦もどきで暦変換を試して見ることにします。

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

        <script src="./jquery-1.9.1.min_.js"></script>   
        <script type="text/javascript"><!--

            $(function() {

                var arrMonthDays   = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
                var arrROKUYOU     = new Array('大安','赤口','先勝','友引','先負','仏滅');
                var arrCahngeTable = new Array();
                var arrDayData     = new Array();
                    arrDayData['2013']         = new Array();
                    arrDayData['2013']['days'] = 533
                    arrDayData['2013']['data'] = 2901
                    arrDayData['2014']         = new Array();
                    arrDayData['2014']['days'] = 412
                    arrDayData['2014']['data'] = 2741
                    arrDayData['2015']         = new Array();
                    arrDayData['2015']['days'] = 650
                    arrDayData['2015']['data'] = 1210
                    arrDayData['2016']         = new Array();
                    arrDayData['2016']['days'] = 507
                    arrDayData['2016']['data'] = 2651
                    arrDayData['2017']         = new Array();
                    arrDayData['2017']['days'] = 369
                    arrDayData['2017']['data'] = 2647
                    arrDayData['2018']         = new Array();
                    arrDayData['2018']['days'] = 611
                    arrDayData['2018']['data'] = 1323
                    arrDayData['2019']         = new Array();
                    arrDayData['2019']['days'] = 468
                    arrDayData['2019']['data'] = 2709
                    arrDayData['2020']         = new Array();
                    arrDayData['2020']['days'] = 329
                    arrDayData['2020']['data'] = 5781


                $('#chackData').click(function () {

                    // Data Get
                    yData = parseInt($('#year option:selected').val());
                    mData = parseInt($('#month option:selected').val());
                    dData = parseInt($('#day option:selected').val());

                    // Data Change
                    //// Count Day
                    cntDays = dData;
                    for (var tempM = 1; tempM < mData; tempM++) {
                        cntDays += arrMonthDays[tempM - 1];
                    }
                    if ((yData % 4) == 0) {
                        if ((yData % 100) == 0) {
                            if ((yData % 400) == 0) {
                                cntDays++;
                            }
                        } else {
                            cntDays++;
                        }
                    }

                    tableSet(yData);
                    if (cntDays < arrCahngeTable[0]['days']) {
                        cntDays += 365;
                        if ((yData % 4) == 0) {
                            if ((yData % 100) == 0) {
                                if ((yData % 400) == 0) {
                                    cntDays++;
                                }
                            } else {
                                cntDays++;
                            }
                        }
                        tableSet((yData - 1));
                    }

                    getMon = 0;
                    getDay = 0;
                    for (var mCnt = 12; mCnt >= 0 ; mCnt--) {
                        if (arrCahngeTable[mCnt]['month'] != 0) {
                            if (arrCahngeTable[mCnt]['days'] <= cntDays) {
                                getMon = arrCahngeTable[mCnt]['month'];
                                getDay = cntDays - arrCahngeTable[mCnt]['days'] + 1;

                                break;
                            }
                        }
                    }
                    if (getMon < 0) {
                        getMon = -getMon;
                    }


                    // Disp Set
                    $('#dispData').text(getMon + '/' + getDay + '(' + arrROKUYOU[(getMon + getDay) % arrROKUYOU.length] + ')');

                });

                function tableSet(yData) {
                
                    tempDays = arrDayData[yData]['days'];
                    tempData = arrDayData[yData]['data'];
                    workDays = Math.floor(tempDays / 13 + 0.001);
                    uruuFlg  = tempDays % 13;
                    if (uruuFlg == 0) {
                        tempData *= 2;
                        maxMonth  = 12;
                    } else {
                        maxMonth  = 13;
                    }

                    arrCahngeTable[0] = new Array();
                    arrCahngeTable[0]['days']  = workDays;
                    arrCahngeTable[0]['month'] = 1;
                    for (var mCnt = 1; mCnt <= maxMonth; mCnt++) {
                        arrCahngeTable[mCnt] = new Array();
                        arrCahngeTable[mCnt]['days']  = arrCahngeTable[mCnt - 1]['days'] + 29;
                        arrCahngeTable[mCnt]['month'] = mCnt + 1;
                        if (tempData >= 4096) {
                            arrCahngeTable[mCnt]['days']++;
                        }
                                                
                        tempData = (tempData % 4096) * 2;
                    }
                    arrCahngeTable[maxMonth]['month'] = 0;

                    if (maxMonth > 12) {
                        for (var mCnt = uruuFlg + 1; mCnt < 13; mCnt++) {
                            arrCahngeTable[mCnt]['month'] = mCnt;
                        }
                        arrCahngeTable[uruuFlg]['month'] = -uruuFlg;
                    } else {
                        arrCahngeTable[13] = new Array();
                        arrCahngeTable[13]['days']  = 0;
                        arrCahngeTable[13]['month'] = 0;
                    }
                    
                }

            });

        --></script>

        <link rel="stylesheet" href="reset.css" type="text/css">
        <style type="text/css"><!--

            div {
                margin          : 5px;
            }

        --></style>

    </head>

        <div id="data_area">
            西暦:
            <select id="year" class="dateSelect">
                <option value="2014" selected="selected">2014</option>
                <option value="2015">2015</option>
                <option value="2016">2016</option>
                <option value="2017">2017</option>
                <option value="2018">2018</option>
                <option value="2019">2019</option>
                <option value="2020">2020</option>
            </select>
            /
            <select id="month" class="dateSelect">
                <option value="1" selected="selected">1</option>
                <option value="2">2</option>
                <option value="3">3</option>
                <option value="4">4</option>
                <option value="5">5</option>
                <option value="6">6</option>
                <option value="7">7</option>
                <option value="8">8</option>
                <option value="9">9</option>
                <option value="10">10</option>
                <option value="11">11</option>
                <option value="12">12</option>
            </select>
            /
            <select id="day" class="dateSelect">
                <option value="1" selected="selected">1</option>
                <option value="2">2</option>
                <option value="3">3</option>
                <option value="4">4</option>
                <option value="5">5</option>
                <option value="6">6</option>
                <option value="7">7</option>
                <option value="8">8</option>
                <option value="9">9</option>
                <option value="10">10</option>
                <option value="11">11</option>
                <option value="12">12</option>
                <option value="13">13</option>
                <option value="14">14</option>
                <option value="15">15</option>
                <option value="16">16</option>
                <option value="17">17</option>
                <option value="18">18</option>
                <option value="19">19</option>
                <option value="20">20</option>
                <option value="21">21</option>
                <option value="22">22</option>
                <option value="23">23</option>
                <option value="24">24</option>
                <option value="25">25</option>
                <option value="26">26</option>
                <option value="27">27</option>
                <option value="28">28</option>
                <option value="29">29</option>
                <option value="30">30</option>
                <option></option>
            </select>
            <button id="chackData">Click Me!!</button>
        </div>

        <div id="disp_area">
            太陰暦:<span id="dispData"></span>
        </div>

    </body>
</html>

sample

sample では指定した日付をに対して、旧暦の月・日を表示するようにしてみました。
それにともなって六曜を表示しています。
太陰暦での月日を算出方法が解れば、後は前回の内容を適用するだけです。

それにしても太陰暦の出し方がこんなに面倒なものだとは思いませんでした。
今回は既に計算済みのデータを使用する簡易版ですが、仮に計算で割り出すにしても何年かするとズレが生じるようです。
そのため、特定の期間しか対応出来ないというものが多いようですね。

今後の業務にて太陰暦を算出する機会が何度あるかわかりませんがとりあえずは対応できそうです。
・・・まぁ、内容は理解しましたし正確なデータが必要な場合はAPIを探して使う方がいいのかもしれません。
どうしようか悩むところではありますねぇ・・・

jQuery はここからダウンロードしてください。

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です