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。
対応している元号
時代 | 西暦範囲 | 元号による範囲 | よみ | 年数 |
---|---|---|---|---|
近代(明治以降)(157年間) | 1989-01-08 ~ 2021-03-01 | 平成1年01月08日 ~ 平成33年03月01日 | へいせい | 33年間 |
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というか今後の計画?
- 元号の一覧をクエリできるとかあったらいいかも。
- 日付に関するTIPSを返すとか、Wikipediaへのリンクを返すとかも。
- JSONで元号の名前や略称の情報をばらばらに返すメソッド作るべき。
- 平成1年は平成元年としたいものだ。あと漢数字バージョンとか。難しいほうの字を使うとか。
- 中国や韓国にも元号があるんだね。頭の角においておく。
- H240301みたいな形式から西暦への変換。
- 今後、変換テーブルをDBに放り込まないとやってられないような気がする。
- 旧暦の情報も出したい。(変換方法については「旧暦の仕組み(外部サイト)」に詳しく書いてありますね)
更新履歴
- 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に放り込みたくなったが、それはそれで邪魔くさいからまた今度。
明治より前は、旧暦が使われているようなのですが、返却する月日はグレゴリオ暦となっています。 年末年始辺りで、年と月日に不整合が起きている気がする。
変換テーブルは手入力したので、間違ってる可能性もあります。見つけたら教えてください。