趣味は車輪の再発明♪

jsonpによる西暦⇒和暦変換処理のサンプル



実際に動作する簡単なフォームと、jsonpのコードを紹介しています。 このページから変換する分にはクロスドメインにはなってませんけど、 インターネットにつながっていれば、世界中どこからでも日付を変換できますね(大げさw)。

西暦から和暦への変換

日付: 結果:

これくらい単純な変換ならば、なにもJSONPじゃなくても、javascriptで実装しておけば、スクリプトを取り込むだけで変換できるわけで、一生懸命作った割には、あまりメリットは感じませんね (アハハw orz.

JSONPの強みって、サーバー側で処理されているってことですから、たとえば日付や元号に関する情報をかき集めて、クライアントへ提供するというような機能というか、サービスを考えると広がるかも。 エンターテイメント性を醸し出せたらよいと思うのですが、当然ながら、そこがなかなかムツカシイわけで・・・。

サンプルコード(html,javascript)

とりあえず、上のフォームのコードを以下に記しておきます。

<-- 操作オブジェクト -->
<input id="txtInput" type="text" value="2012-02-29"
    placeholder="yyyy-m-d"/>
<button type="button" onclick="toWareki();">変換</button>
<input id="txtOutput" type="text" value=""
    placeholder="(結果が表示されます)" disabled="disabled"/>

<script type='text/javascript'
src='http://bicycle.life.coocan.jp/takamints/js/takamints.js'>
</script>
<script type='text/javascript'>
function toWareki() {
	//コールバック指定して呼び出すだけ。
	takamints.toWareki(
		document.getElementById('txtInput').value,
		function (strWarekiDate) {
			document.getElementById('txtOutput').value = strWarekiDate;
		}
	);
}
</script>

上で取り込んでいるtakamints.jsは以下のようになっています。

takamints = {
  //試験環境と本番環境でURL切り替え(デバッグ用)
  is_local : function() {
    return (document.location.host == '127.0.0.1');
  }(),
  //試験環境と本番環境でURL切り替え(デバッグ用)
  url_prefix : function() {
    return (document.location.host == '127.0.0.1')
      ?'http://127.0.0.1/bicycle.life.coocan.jp'
      :'http://bicycle.life.coocan.jp';
  }(),
  //JSONPサポート
  jsonp : {
    seq : 0, map : {},
    //jsonpの実行
    execute: function(url, callback) {
      var id = 'takamints_jsonp' + takamints.jsonp.seq;
      takamints.jsonp.seq++;
      takamints.jsonp.map[id] = callback;
      var s = document.createElement('script');
      if(url.indexOf('?') < url.length - 1) {
        url += '&';
      }
      s.id = id;
      s.src = url + 'callback=takamints.jsonp.callback&jsonpId=' + id;
      s.type = 'text/javascript';
      document.body.appendChild(s);
    },
    //jsonpのコールバック
    callback: function(id, param) {
      var callback = takamints.jsonp.map[id];
      delete takamints.jsonp.map[id];
      var s = document.getElementById(id);
      if(s) {
        s.parentNode.removeChild(s);
      }
      callback.call(null, param);
    }
  },
  //和暦変換
  toWareki : function(strDate, callback) {
    var jsonpUrl = takamints.url_prefix + '/takamints/index.php/wareki/';
    takamints.jsonp.execute(jsonpUrl + 'toWareki?d=' + strDate, callback);
  }
};
function onResize() {
  var bodyContentPane = $("#docBody > div").get(0);
  var strWidth = bodyContentPane.getEffectiveWidth();
  var width = parseInt(strWidth);
  if($(".rightSideSub").length > 0) {
    if(width >= 350-32) {
      if(width < 760-32) {
        width -= 140;
      } else {
        width = 760 - 32 - 140;
      }
    }
  }
  $("#docBody > div > .content").css("width",  width + 'px');
}
$(function() {
  onResize();
  $(window).resize(onResize);
});

JSONP臭くないのは上出来だと自画自賛しながら一杯呑めますw。

対応している元号

時代 西暦範囲 元号による範囲 よみ 年数
近代(明治以降)(153年間) 1989-01-08 ~ 2017-07-22 平成1年01月08日 ~ 平成29年07月22日 へいせい 29年間
  1926-12-25 ~ 1989-01-07 昭和1年12月25日 ~ 昭和64年01月07日 しょうわ 64年間
  1912-07-30 ~ 1926-12-24 大正1年07月30日 ~ 大正15年12月24日 たいしょう 15年間
  1868-10-23 ~ 1912-07-29 明治1年10月23日 ~ 明治45年07月29日 めいじ 45年間
江戸時代(288年間) 1865-05-01 ~ 1868-10-22 慶応1年05月01日 ~ 慶応4年10月22日 けいおう 4年間
  1864-03-27 ~ 1865-04-30 元治1年03月27日 ~ 元治2年04月30日 げんじ 2年間
  1861-03-29 ~ 1864-03-26 文久1年03月29日 ~ 文久4年03月26日 ぶんきゅう 4年間
  1860-04-08 ~ 1861-03-28 万延1年04月08日 ~ 万延2年03月28日 まんえん 2年間
  1855-01-15 ~ 1860-04-07 安政1年01月15日 ~ 安政6年04月07日 あんせい 6年間
  1848-04-01 ~ 1855-01-14 嘉永1年04月01日 ~ 嘉永8年01月14日 かえい 8年間
  1845-01-09 ~ 1848-03-31 弘化1年01月09日 ~ 弘化4年03月31日 こうか 4年間
  1831-01-23 ~ 1845-01-08 天保1年01月23日 ~ 天保15年01月08日 てんぽう 15年間
  1818-05-26 ~ 1831-01-22 文政1年05月26日 ~ 文政14年01月22日 ぶんせい 14年間
  1804-03-22 ~ 1818-05-25 文化1年03月22日 ~ 文化15年05月25日 ぶんか 15年間
  1801-03-19 ~ 1804-03-21 享和1年03月19日 ~ 享和4年03月21日 きょうわ 4年間
  1789-02-19 ~ 1801-03-18 寛政1年02月19日 ~ 寛政13年03月18日 かんせい 13年間
  1781-04-25 ~ 1789-02-18 天明1年04月25日 ~ 天明9年02月18日 てんめい 9年間
  1772-12-10 ~ 1781-04-24 安永1年12月10日 ~ 安永10年04月24日 あんえい 10年間
  1764-06-30 ~ 1772-12-09 明和1年06月30日 ~ 明和9年12月09日 めいわ 9年間
  1751-12-14 ~ 1764-06-29 宝暦1年12月14日 ~ 宝暦14年06月29日 ほうれき 14年間
  1748-08-05 ~ 1751-12-13 寛延1年08月05日 ~ 寛延4年12月13日 かんえん 4年間
  1744-04-03 ~ 1748-08-04 延享1年04月03日 ~ 延享5年08月04日 えんきょう 5年間
  1741-04-12 ~ 1744-04-02 寛保1年04月12日 ~ 寛保4年04月02日 かんぽう 4年間
  1736-06-07 ~ 1741-04-11 元文1年06月07日 ~ 元文6年04月11日 げんぶん 6年間
  1716-08-09 ~ 1736-06-06 享保1年08月09日 ~ 享保21年06月06日 きょうほう 21年間
  1711-06-11 ~ 1716-08-08 正徳1年06月11日 ~ 正徳6年08月08日 しょうとく 6年間
  1704-04-16 ~ 1711-06-10 宝永1年04月16日 ~ 宝永8年06月10日 ほうえい 8年間
  1688-10-23 ~ 1704-04-15 元禄1年10月23日 ~ 元禄17年04月15日 げんろく 17年間
  1684-04-05 ~ 1688-10-22 貞享1年04月05日 ~ 貞享5年10月22日 じょうきょう 5年間
  1681-11-09 ~ 1684-04-04 天和1年11月09日 ~ 天和4年04月04日 てんな 4年間
  1673-10-30 ~ 1681-11-08 延宝1年10月30日 ~ 延宝9年11月08日 えんぽう 9年間
  1661-05-23 ~ 1673-10-29 寛文1年05月23日 ~ 寛文13年10月29日 かんぶん 13年間
  1658-08-21 ~ 1661-05-22 万治1年08月21日 ~ 万治4年05月22日 まんじ 4年間
  1655-05-18 ~ 1658-08-20 明暦1年05月18日 ~ 明暦4年08月20日 めいれき 4年間
  1652-10-20 ~ 1655-05-17 承応1年10月20日 ~ 承応4年05月17日 じょうおう 4年間
  1648-04-07 ~ 1652-10-19 慶安1年04月07日 ~ 慶安5年10月19日 けいあん 5年間
  1645-01-13 ~ 1648-04-06 正保1年01月13日 ~ 正保4年04月06日 しょうほう 4年間
  1624-04-17 ~ 1645-01-12 寛永1年04月17日 ~ 寛永22年01月12日 かんえい 22年間
  1615-09-05 ~ 1624-04-16 元和1年09月05日 ~ 元和10年04月16日 げんな 10年間
安土桃山時代(45年間) 1596-12-16 ~ 1615-09-04 慶長1年12月16日 ~ 慶長20年09月04日 けいちょう 20年間
  1593-01-10 ~ 1596-12-15 文禄1年01月10日 ~ 文禄4年12月15日 ぶんろく 4年間
  1573-08-25 ~ 1593-01-09 天正1年08月25日 ~ 天正21年01月09日 てんしょう 21年間
戦国時代(119年間) 1570-05-07 ~ 1573-08-24 元亀1年05月07日 ~ 元亀4年08月24日 げんき 4年間
  1558-03-18 ~ 1570-05-06 永禄1年03月18日 ~ 永禄13年05月06日 えいろく 13年間
  1555-11-07 ~ 1558-03-17 弘治1年11月07日 ~ 弘治4年03月17日 こうじ 4年間
  1532-08-29 ~ 1555-11-06 天文1年08月29日 ~ 天文24年11月06日 てんぶん 24年間
  1528-09-03 ~ 1532-08-28 享禄1年09月03日 ~ 享禄5年08月28日 きょうろく 5年間
  1521-09-23 ~ 1528-09-02 大永1年09月23日 ~ 大永8年09月02日 だいえい 8年間
  1504-03-16 ~ 1521-09-22 永正1年03月16日 ~ 永正18年09月22日 えいしょう 18年間
  1501-03-18 ~ 1504-03-15 文亀1年03月18日 ~ 文亀4年03月15日 ぶんき 4年間
  1492-08-12 ~ 1501-03-17 明応1年08月12日 ~ 明応10年03月17日 めいおう 10年間
  1489-09-16 ~ 1492-08-11 延徳1年09月16日 ~ 延徳4年08月11日 えんとく 4年間
  1487-08-09 ~ 1489-09-15 長享1年08月09日 ~ 長享3年09月15日 ちょうきょう 3年間
  1469-06-08 ~ 1487-08-08 文明1年06月08日 ~ 文明19年08月08日 ぶんめい 19年間
  1467-04-09 ~ 1469-06-07 応仁1年04月09日 ~ 応仁3年06月07日 おうにん 3年間
南北朝時代・室町時代(84年間) 1466-03-14 ~ 1467-04-08 文正1年03月14日 ~ 文正2年04月08日 ぶんしょう 2年間
  1461-02-01 ~ 1466-03-13 寛正1年02月01日 ~ 寛正6年03月13日 かんしょう 6年間
  1457-10-16 ~ 1461-01-31 長禄1年10月16日 ~ 長禄5年01月31日 ちょうろく 5年間
  1455-09-06 ~ 1457-10-15 康正1年09月06日 ~ 康正3年10月15日 こうしょう 3年間
  1452-08-10 ~ 1455-09-05 享徳1年08月10日 ~ 享徳4年09月05日 きょうとく 4年間
  1449-08-16 ~ 1452-08-09 宝徳1年08月16日 ~ 宝徳4年08月09日 ほうとく 4年間
  1444-02-23 ~ 1449-08-15 文安1年02月23日 ~ 文安6年08月15日 ぶんあん 6年間
  1441-03-10 ~ 1444-02-22 嘉吉1年03月10日 ~ 嘉吉4年02月22日 かきつ 4年間
  1429-10-03 ~ 1441-03-09 永享1年10月03日 ~ 永享13年03月09日 えいきょう 13年間
  1428-06-10 ~ 1429-10-02 正長1年06月10日 ~ 正長2年10月02日 しょうちょう 2年間
  1394-08-02 ~ 1428-06-09 応永1年08月02日 ~ 応永35年06月09日 おうえい 35年間

TODOというか今後の計画?

  1. 元号の一覧をクエリできるとかあったらいいかも。
  2. 日付に関するTIPSを返すとか、Wikipediaへのリンクを返すとかも。
  3. JSONで元号の名前や略称の情報をばらばらに返すメソッド作るべき。
  4. 平成1年は平成元年としたいものだ。あと漢数字バージョンとか。難しいほうの字を使うとか。
  5. 中国や韓国にも元号があるんだね。頭の角においておく。
  6. H240301みたいな形式から西暦への変換。
  7. 今後、変換テーブルをDBに放り込まないとやってられないような気がする。
  8. 旧暦の情報も出したい。(変換方法については「旧暦の仕組み(外部サイト)」に詳しく書いてありますね)

更新履歴

2011-03-04

各元号の年数を表示。大正時代の開始年を間違えていたので修正(はずかしっ)。

2011-03-03

南北朝統一時点まで対応。なんかええ方法は無いものかな。そして、これ以前は南朝と北朝に分かれてしまうのですね。困るなぁ後醍醐天皇。どうするべきだろう。

2011-03-02

元号の日付範囲を表示するようにした。phpのバージョンが5.2.14と少々古く、DateTimeが使えないと思いこんでいて使用を避けていたのだが、5.3以降でしか使えないのはaddメソッドやDateIntervalクラスだった。

2011-03-01

朝の時点では明治までで且つバグありでしたが、とりあえず江戸時代最初の1615-09-15まで情報入れた(頑張ったw)。
この時点でDBに放り込みたくなったが、それはそれで邪魔くさいからまた今度。
明治より前は、旧暦が使われているようなのですが、返却する月日はグレゴリオ暦となっています。 年末年始辺りで、年と月日に不整合が起きている気がする。
変換テーブルは手入力したので、間違ってる可能性もあります。見つけたら教えてください。



RSS Feed Widget
jsonpによる西暦⇒和暦変換処理のサンプル
(http://bicycle.life.coocan.jp/takamints/index.php/wareki)
by Koji Takami ( email: vzg03566@gmail.com, GitHub: takamin )