「暦変換」の編集履歴(バックアップ)一覧に戻る

暦変換 - (2018/10/05 (金) 22:08:39) のソース

大宇宙で使われてる各種暦の相互変換ができます。

#html2(){{
<div id="app-calendartrans"></div>
}}

#javascript(){{
(function() {

var calendars = [
  {name: "シンテーア暦", days: 350, offset: 1312},
  {name: "西暦", days: 365.242190402, offset: 2140.97736},
  {name: "ガールン暦", days: 156.005235556, offset: 4681.676},
  {name: "ロフィルナ暦", days: 365.242190402, offset: 1},
  {name: "シャルカ暦", days: 637.069, offset: 2272.116},
  {name: "ピリフィアー暦", days: 365.25, offset: 1665},
  {name: "プロルド暦", days: 300, offset: 1807.8333},
  {name: "クレデリア暦", days: 300, offset: -261.1667},
  {name: "ドラゴニズム暦", days: 500, offset: 51.40000001},
  {name: "カラ新暦", days: 405.625, offset: 1795.054},
  {name: "ヌキ=ルノラドガ暦", days: 494.2, offset: 1825},
  {name: "ダバーヤ暦", days: 249, offset: 5286}
];
var gregorian = 1;
var ie = !window.addEventListener;

if (ie) {
  window.attachEvent("onload", init);
} else {
  window.addEventListener("load", init);
  document.addEventListener("DOMContentLoaded", init);
}

var inited = false;
var inputs, errorRanges;
function init() {
  if (inited) return;
  var container = document.getElementById("app-calendartrans");
  container.style.lineHeight = "2";
  var oninput, span;
  inputs = [];
  errorRanges = [];
  for (var i = 0; i < calendars.length; i++) {
    container.appendChild(document.createTextNode(calendars[i].name + " : "));
    inputs[i] = document.createElement("input");
    inputs[i].setAttribute("type", "text");
    inputs[i].style.width = "6em";
    oninput = (function(i) {
      return function() {update(i);}
    })(i);
    if (ie) {
      inputs[i].attachEvent("oninput", oninput);
      inputs[i].attachEvent("onkeypress", oninput);
    } else {
      inputs[i].addEventListener("input", oninput);
      inputs[i].addEventListener("keypress", oninput);
    }
    container.appendChild(inputs[i]);
    container.appendChild(document.createTextNode("年 "));
    span = document.createElement("span");
    span.style.fontSize = "80%";
    errorRanges[i] = document.createTextNode("");
    span.appendChild(errorRanges[i]);
    container.appendChild(span);
    container.appendChild(document.createElement("br"));
  }
  inputs[gregorian].value = (new Date()).getFullYear()
  update(gregorian);
  inited = true;
}

function update(id) {
  var inputYear = inputs[id].value;
  if (isNaN(inputYear)) return;
  var inputMinDay = (inputYear - calendars[id].offset) * calendars[id].days;
  var inputMaxDay = inputMinDay + calendars[id].days;
  var minYear, maxYear
  for (var i = 0; i < calendars.length; i++) {
    if (id == i) {
      errorRanges[i].nodeValue = "";
      continue;
    }
    minYear = 
  }
}

})();
}}

**注意点
それぞれの暦ごとに1年の時間が違うことなどが原因で、それぞれの年と年は綺麗には対応していない。
それを、暦変換器では (±0 〜 +1年) のような表記で表している。

例えばロフィルナ暦356年と入力すると、シンテーア暦1682(±0 〜 +1年)と出てくる。
これは、ロフィルナ暦365年1月1日の時点では、シンテーア暦1682年だが、ロフィルナ暦365年大晦日には、シンテーア暦ではもう正月を迎えていて1683年になっているということである。