セキュリティ新着情報をつぶやく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"
参考
- Ruby 2.4.0 リファレンスマニュアル Dateクラス
- 全角数字を半角数字に変換するお手軽な方法
- 和暦と西暦を変換する - Ruby Tips!
- 政府機関等のセキュリティ関連の新着情報をつぶやくTwitterボットを公開しました - トリコロールな猫/セキュリティ
-
最後の日付が半角数字になっていますが、コード上は全角数字です。 ↩