2008年04月14日 17:30 [Edit]

javascript - 和暦コンバーター

すでにPerlに関してはdmakiがDateTime::Calendar::Japaneseを出しているのでJavaScriptで。

西暦から和暦を変換してくれるRailsプラグイン: JaDates : HotWeb Magazine
最近とあるRailsプロジェクトで4月5日2008年ではなく、平成20年4月5日として表示したかったがそれを簡単に変換するヘルパーがなかったので、ヘルパーを開発しました。

待ち時間の暇つぶしで書いたので大したものではありませんが、そこそこ使えるかも。


日は です。

明治から平成までしかサポートしていませんが、年単位ではなく日単位で対応してます。1989年1月7日とかにしてみてください。

ソースはこちら。

Date.JapaneseEra = {
  'M':(new Date(1868,  0, 25)).getTime(),
  'T':(new Date(1912,  6, 30)).getTime(),
  'S':(new Date(1926, 11, 25)).getTime(),
  'H':(new Date(1989,  0,  6)).getTime()
};

Date.prototype.getJapaneseYear = function(){
    var when = this.getTime();
    var yyyy = this.getFullYear();
    if (when < Date.JapaneseEra['M']) throw "too many years ago";
    if (when < Date.JapaneseEra['T']) return "明治" + (yyyy - 1868);
    if (when < Date.JapaneseEra['S']) return "大正" + (yyyy - 1912);
    if (when < Date.JapaneseEra['H']) return "昭和" + (yyyy - 1925);
    return "平成" + (yyyy - 1988);
};

Date.prototype.getJapaneseYear = function(){
    var when = this.getTime();
    var yyyy = this.getFullYear();
    if (when < Date.JapaneseEra['M']) throw "too many years ago";
    if (when < Date.JapaneseEra['T']) return "明治" + (yyyy - 1868);
    if (when < Date.JapaneseEra['S']) return "大正" + (yyyy - 1912);
    if (when < Date.JapaneseEra['H']) return "昭和" + (yyyy - 1925);
    return "平成" + (yyyy - 1988);
};

Date.prototype.toJapaneseDateString = function(){
  return this.getJapaneseYear() + '年'
       + (this.getMonth() + 1) + '月'
       + this.getDate() + '日';
};

function update_nengo(){
  var $ = function(id){ return document.getElementById(id) };
  var yyyy = parseInt($('yyyy').value);
  var mm   = parseInt($('mm').value)-1;
  var dd   = parseInt($('dd').value);
  var isleap = function(yyyy){
    return yyyy % 4   != 0 ? false :
           yyyy % 100 != 0 ? true :
           yyyy % 400 != 0 ? false : true;
  };
  var dofm = [31, (isleap(yyyy) ? 29 : 28), 31, 30, 31, 30,
              31, 31                      , 30, 31, 30, 31][mm];
  if (dd > dofm) dd = dofm;
  $('dd').innerHTML = '';
  for (var i = 1; i <= dofm; i++){
    var option = document.createElement('option');
    option.innerHTML = i;
    if (i == dd) option.setAttribute('selected', true);
    $('dd').appendChild(option);
  };
  var when = new Date(yyyy, mm, dd);
  $('nengo').innerHTML = when.toJapaneseDateString();
};
update_nengo();

Enjoy!

Dan the Man with Too Many Calendars to Support


この記事へのトラックバックURL

この記事へのトラックバック
年月を扱うスクリプトを作っていると、やっかいなのは和暦と西暦を変換しなければならない時などです。 そんな時に便利そうな「和暦コンバーター」が 404 Blog Not Foundで公開さ...
[ライブラリ] 西暦から和暦に変換する『和暦コンバーター』【Recently Ajax | Prototype、Spryなどを中心としたAjax情報提供ブログ】at 2008年04月15日 21:18
この記事へのコメント
バックツーザフューチャー
おもすれ〜
西暦1年1月7日は明治33年1月7日です。
キタコレ

Posted by イニ at 2008年04月17日 00:15
>西暦99999年は平成98011年。
 あー、それはでも、いたしかたないかと・・・。
 ちゃんとやるとしたら、未来の日付を入力したときに、「その和暦は、必ずしも有効である保証はありません」とかメッセージをだすしかないですね。
 そんなに極端な未来じゃなくても、「平成21年1月1日」とかだって厳密に言えば・・・おっと、これ以上は自重自重。
Posted by 寿命 at 2008年04月16日 18:45
西暦99999年は平成98011年。
Posted by taka.BRK at 2008年04月16日 17:50
 明治と大正で1年ずれてるのは凡ミスだからいいとして・・・。

 >明治から平成までしかサポートしていませんが

 上でどなたか言及されてますけど、明治6年元日より前は、日本ではグレゴリオ暦を使っていないし、西暦と和暦の対応には法則なんかありませんから、テーブルを作って参照するしかありません。

 明治6年元日以降は、西暦と全く同じ日付なので、変換後に日付けを表示するのは無駄だし、それより前は、このプログラム、無意味です。仮に上の凡ミスを修正したとしても、

→グレゴリオ暦1873年 1月 1日は、明治 6年 1月 1日 ですが、

その前日

 グレゴリオ暦1872年12月31日は、明治 5年12月 2日 です。
 12月31日ではありません。

 月の長さの違い、閏月の扱い、アルゴリズムで自動計算は無理。
これが、実際の文献を扱うとなると、中世ヨーロッパじゃそもそも1年の始まりが Jan. 1じゃないなんてフツーだし・・。
Posted by 寿命 at 2008年04月15日 16:25
IE6でも日が入力できないですね
Posted by コーエン at 2008年04月15日 06:53
IE7だと日が入力出来ないっぽい。
Firefoxは動きました。
Posted by さも at 2008年04月15日 00:16
サポートするのは明治6年以降にしたほうがいいのでは
Posted by yabuki at 2008年04月14日 21:34
Date.prototype.getJapaneseYear の定義を2回行っている様な・・・。
Posted by zenpou at 2008年04月14日 20:57
平成は1月8日からですよー
Posted by ガム at 2008年04月14日 18:24
「日」の欄が選択もできないし、入力もできないのですが、これは私だけ?
Posted by しま at 2008年04月14日 18:04