その24:グレゴリオ暦日付計算



グレゴリオ暦の西暦1/1/1からの経過日数などを計算してみよう

■閏年法
・4で割り切れる年を閏年
・例外として100で割り切れて400で割り切れない年は平年
・更に例外として1000年は閏年
従って暦上の1年は
1/4-1/100+1/400+1/1000+365日

■上記の閏年法とフェアフィールドの公式より
Y/M/D(※3<=m<=14:M:1,2->y=Y-1,m=M+12)
西暦1/1/1からの日数計算
days = Math.floor((365*y + Math.floor(y/4) - (Math.floor(y/100) - Math.floor(y/400)) + Math.floor(y/1000) )+Math.floor(306*(m+1)/10)+d-429);
西暦1/1/1からの曜日計算(0:土曜日)
week=days%7
西暦1/1/1からのミリ秒計算
days*24*60*60*1000
西暦Y0/M0/D0から西暦Y1/M1/D1までの日数計算
days0 = Math.floor((365*y0 + Math.floor(y0/4) - (Math.floor(y0/100) - Math.floor(y0/400)) + Math.floor(y0/1000) )+Math.floor(306*(m0+1)/10)+d0-429);
days1 = Math.floor((365*y1 + Math.floor(y1/4) - (Math.floor(y1/100) - Math.floor(y1/400)) + Math.floor(y1/1000) )+Math.floor(306*(m1+1)/10)+d1-429);
DAYS=days1-days0

■逆変換

var ya = Math.floor(((daya+428)*400)/146097);
1年間の日数
var x = (daya + 428) - Math.floor((ya * 146097) / 400) - Math.floor(ya/1000) + 2;
閾値以下
if(x < 123){
 ya--;
 x = (daya + 428) - Math.floor((ya * 146097) / 400) - Math.floor(ya/1000) + 2;
}
閏年補正
if(ya % 4 == 0){
 if(((ya % 100 == 0)&&(ya % 400 != 0))||(ya == 0));
 else x--;
}

var ma = Math.floor(10 * x / 306) - 1;

var da = Math.floor(x - 306*(ma+1) / 10);
閾値以下
if(da <= 0){
 ma--;
 da = Math.floor(x - 306*(ma+1) / 10);
}
1,2月補正
if(12 < ma) {
 ya++;
 ma -= 12;
}



日付0
西暦年 月 
日付1
西暦年 月 
加算日数

解答
西暦年 月 
曜日曜日
経過日数
経過ミリ秒ミリ秒

(日付1-)日付0+加算日数





koyomi.htm

...省略...

<script>

var Weeks = ["土", "日", "月", "火", "水", "木", "金"];

function calc() {
  var elm = document.getElementById('TXTY0');
  var y0 = Number(elm.value)
  elm = document.getElementById('TXTM0');
  var m0 = Number(elm.value)
  elm = document.getElementById('TXTD0');
  var d0 = Number(elm.value)
  elm = document.getElementById('TXTY1');
  var y1 = Number(elm.value)
  elm = document.getElementById('TXTM1');
  var m1 = Number(elm.value)
  elm = document.getElementById('TXTD1');
  var d1 = Number(elm.value)
  elm = document.getElementById('TXTDT');
  var dt = Number(elm.value)

  if(m0 == 1 || m0 == 2){
    y0--;
    m0 += 12;
  }
  var days0 = Math.floor((365*y0 + Math.floor(y0/4) - (Math.floor(y0/100) - Math.floor(y0/400)) + Math.floor(y0/1000) )+Math.floor(306*(m0+1)/10)+d0-429);
  var flg = false;
  var days1 = dt;
  if(0 < y1){
    flg = true;
    if(m1 == 1 || m1 == 2){
      y1--;
      m1 += 12;
    }
    days1 = Math.floor((365*y1 + Math.floor(y1/4) - (Math.floor(y1/100) - Math.floor(y1/400)) + Math.floor(y1/1000) )+Math.floor(306*(m1+1)/10)+d1-429+dt) - days0;
  }
  else {
    y1 = y0;
    m1 = m0;
    d1 = d0;
  }

  var daya = days1 + days0;
  var weeka = daya % 7;
  var msa = (daya - days0) * 24 * 60 * 60 * 1000;

  elm = document.getElementById('TXTDTA');
  elm.value = daya - days0;
  elm = document.getElementById('TXTWKA');
  elm.value = Weeks[weeka];
  elm = document.getElementById('TXTMSA');
  elm.value = msa;

  var ya = Math.floor(((daya+428)*400)/146097);
  var x = (daya + 428) - Math.floor((ya * 146097) / 400) - Math.floor(ya/1000) + 2;
  if(x < 123){
    ya--;
    x = (daya + 428) - Math.floor((ya * 146097) / 400) - Math.floor(ya/1000) + 2;
  }
  if(ya % 4 == 0){
    if(((ya % 100 == 0)&&(ya % 400 != 0))||(ya == 0));
    else x--;
  }

  var ma = Math.floor(10 * x / 306) - 1;
  var da = Math.floor(x - 306*(ma+1) / 10);
  if(da <= 0){
    ma--;
    da = Math.floor(x - 306*(ma+1) / 10);
  }
  if(12 < ma) {
    ya++;
    ma -= 12;
  }

  elm = document.getElementById('TXTYA');
  elm.value = ya;
  elm = document.getElementById('TXTMA');
  elm.value = ma;
  elm = document.getElementById('TXTDA');
  elm.value = da;

}

</script>

...省略...

<hr>
<br>
日付0<br>
西暦<input type="text" id="TXTY0" value="1">年 <input type="text" id="TXTM0" value="1">月 <input type="text" id="TXTD0" value="1">日<br>
日付1<br>
西暦<input type="text" id="TXTY1" value="-1">年 <input type="text" id="TXTM1" value="-1">月 <input type="text" id="TXTD1" value="-1">日<br>
加算日数<input type="text" id="TXTDT" value="0">日<br>
<br>
解答<br>
西暦<input type="text" id="TXTYA" value="1" disabled>年 <input type="text" id="TXTMA" value="1" disabled>月 <input type="text" id="TXTDA" value="1" disabled>日<br>
日数<input type="text" id="TXTDTA" value="0" disabled>日<br>
曜日<input type="text" id="TXTWKA" value="土" disabled>曜日<br>
ミリ秒<input type="text" id="TXTMSA" value="0" disabled>ミリ秒<br>
<br>
<input type="button" onclick="calc()"  value="計算"><br>
<br>
<hr>

...省略...









 ■■■ 3Dプログラミング入門講座 ■■■ 
NAS6LIB
ポリゴンテスト解説・x3dom使い方
その1:ベクトル
その2:行列
その3:クォータニオン
その4:基本総復習・実践
その5:応用その1・メッシュアニメーション、動的テクスチャ
その6:応用その2・GLSL、カスタムシェーダー、キーボード、ファイル
その7:応用その3・ゲームプログラミング、タグの動的追加
その8:応用その4・GLSL、シェーダー、その2
その9:物理演算その1・電卓で相対性理論を解く方法
その10:物理演算その2・相対性理論的ニュートン力学
その11:物理演算その3・ケプラー方程式で惑星軌道シミュレーターを作る

その12:物理演算その4・ルンゲクッタ法で作った 相対性理論的ニュートン力学物理エンジンで惑星軌道シミュレーターを作る

その13:経路探索(A*:A-STAR)&巡回セールスマン問題 : 巨大サイズ : くろにゃんこ

その14:プログラミングにおける配列テーブルテクニック
その15:javascriptのクラス活用法
その16:透視射影公式テスト

その17:ケプラー方程式カプセルライブラリ使用法
その18:CSVファイル処理
その19:物理演算その5・重力多体問題
その20:同次座標について(3D座標系の基本の基本)
その21:おさらいコモンクラスの宣言
その22:物理エンジンライブラリ解説(ケプラー方程式・ルンゲクッタ・相対論的万有引力)
その23:サイト内のリンク先の更新確認がjavascriptで出来るようにする方法
その24:グレゴリオ暦日付計算


 ■■■ THREE.JSプログラミング講座 ■■■ 
THREE.JSテスト解説・THREE.JS使い方
THREE.JS examplesをいじってみた(フレネル反射透過シェーダー)

THREE.JS (半透明シェーダー)

THREE.JS 3D演算で必要な計算(具体例)★とても重要★
THREE.JS THREE-VRM をいじってみた



<<prev リンク先の更新確認 : 工事中 next>>






戻る