[Ruby] 和暦のパース

カテゴリ: misc.

知り合いとちょっと話したお話。

Rubyで和暦を読んで日付のクラスを作りたいということで、irbでこんなのを実行してみました。

require 'date'
d = Date.parse("平成21年9月26日")
d.ctime

これで返ってきた答えは、

=> "Mon Sep 21 00:00:00 2009"

でした。なんだかこれはおかしい。


それでネットを探してみたら、和暦のパースをしようと思ってもパースが有効な形式が限られているようです。

ためになるサイト: 和暦 -> 西暦 – akimatter

日付の形式を”H21.9.26″とか”S63.2.10″などとするとうまくいくようです。

require 'date'
d = Date.parse("S63.8.4")
d.ctime

これを実行したときの回答は、

=> "Thu Aug  4 00:00:00 1988"

で確かにうまくいってます。

この表記で、とりあえず平成(H)・昭和(S)・大正(T)・明治(M)まではうまくいくことが分かりました。でもそれ以前の慶応とか元治とか言うことになるとやっぱり対応できないようです。まあ実用上はほとんど困らないと思いますがね。
そんなわけなので、「平成–年–月–日」という形式の文字列をパースするには、文字列を変換する必要がありそうです。

たぶんこの問題のおおもとはマルチバイト文字の処理にあると思います。”irb -Ks”でも解決されず同じ問題を抱えたままだったんですが、漢字交じり表記の場合、「平成21年9月26日」という文字列の中の「21」しか数字として認識されず、その結果”Mon Sep 21 00:00:00 2009″という結果になったんだと思います。parseの引数に数字を1つだけ渡すと、入力した数字は日にちとして処理され、月・年は現在のものが適用されるようです。

require 'date'
d = Date.parse("10")
d.ctime

この場合の回答は

=> "Thu Sep 10 00:00:00 2009"

です。

ちなみに「平成2年9月26日」という文字列をパースした時の回答は

=> "Sat Sep 26 00:00:00 2009"

であり、「平成2年10月26日」という文字列の場合の回答は

=> "Thu Sep 10 00:00:00 2009"

でした。最初に出てきた2ケタの数を日付として認識し、その他の数字には目もくれないようです。「平成02年09月26日」という文字列でやったら

=> "Wed Sep  2 00:00:00 2009"

となりました。うむむ。

2009/9/26 (土)

コメント