LoginSignup
2
4

More than 5 years have passed since last update.

いろいろなフォーマットの日付をDateオブジェクトに変換する

Posted at

セキュリティ新着情報をつぶやくTwitterボットを作っていて困るのが、日付のフォーマットがバラバラなこと。最初は個々にちまちまgsubしてましたが、どうやらDate.parseを使うと簡単にできるようで・・。

フォーマットの例

対象サイトでの日付は以下のような感じ。

サイト名 日付のフォーマット
警察庁サイバー犯罪対策 H29.5.16
警察庁 @police 2017年05月16日
内閣サイバーセキュリティセンター(NISC) 2017.5.16
高度情報通信ネットワーク社会推進戦略本部(IT総合戦略本部) H29.5.16
総務省 国民のための情報セキュリティサイト 2017/05/16
経済産業省 情報セキュリティ政策 2017年05月16日
CRYPTREC 2017/5/16
日本スマートフォンセキュリティ協会(JSSEC) 2017.5.16
フィッシング対策協議会 2017/05/16
重要生活機器連携セキュリティ協議会(CCDS) 2017.05.16
日本情報経済社会推進協会(JIPDEC) 2017年05月16日

対応したいフォーマット

出てきたフォーマットは以下。

  • YYYY年MM月DD日
  • HYY.MM.DD
  • YYYY.MM.DD
  • YYYY/MM/DD

今後対象サイトを増やすと以下のようなものも出てきそう。

  • 全角数字での表記
  • 平成YY年MM月DD日
  • YY.MM.DD
  • YY/MM/DD

ということで、

  • H29.5.1
  • 2017.5.2
  • 17.5.3
  • 2017/05/04
  • 17/05/05
  • 2017年5月6日
  • 平成29年5月7日
  • 平成29年5月8日

をDateオブジェクトに変換する。

全角数字を半角数字に変換する

数字のみなら以下のようなtr!で簡単にできるそうで。

s.tr!("0-9", "0-9")

区切り文字を処理する

「.」と「/」はそのままでparseできるため、年・月・日のみ以下のように変換する。

  • 年|月 => .
  • 日 => 削除

和暦を処理する

DateクラスはJIS X 0301形式の和暦を解釈できるそうなので、「平成」を「H」に変換する。

コードと結果

以上の処理をしてDate.parseに渡す。

コードは以下の通り1

require 'date'
samples = ["H29.5.1", "2017.5.2", "17.5.3", "2017/05/04", "17/05/05", "2017年5月6日", "平成29年5月7日", "平成29年5月8日"]

samples.each{|sample|
    sample.tr!("0-9", "0-9")
    sample.gsub!(/年|月|日|平成/, "年" => ".", "月" => ".", "日" => "", "平成" => "H")
    p Date.parse(sample).to_s
}

実行結果は以下。

$ ruby test.rb 
"2017-05-01"
"2017-05-02"
"2017-05-03"
"2017-05-04"
"2017-05-05"
"2017-05-06"
"2017-05-07"
"2017-05-08"

参考


  1. 最後の日付が半角数字になっていますが、コード上は全角数字です。 

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4