こんにちは。たなかです。
Ruby on RailsでWebアプリケーションサービスの開発をしています。
開発中以下のようなエラーに遭遇したので、内容と解決方法をご紹介します。
もくじ
文字列を日付(Time)オブジェクトに変換する方法
やりたいこと
["2019/03/13", "143300", "xx", "xxx", "たなか ぼたもち"]
上記のような配列の一つ目(日付)と二つ目(時間)を合わせて、datetimeに変換したいです。
14:33:00が6桁の文字列になっちゃってるのが一癖ですね。
解決方法
Time.parseを使う
Time.parse(row[0].gsub(“\/”, ”) + row[1])
先に結論を書いてしまうと上の一行でいけます。
以下のように出力されます。
Time.parse(row[0].gsub("\/", '') + row[1])
2019-03-13 14:33:00 +0000
詳細な解説
Time.parseという変換メソッドがあります。
以下のような具合に、文字列を汲み取って柔軟に変換してくれる便利なやつです。
require "time"
t = Time.parse("2017/04/25 19:23:55"); p t # 2017-04-25 19:23:55 +0900
t = Time.parse("2017/4/25 19"); p t # 2017-04-25 19:00:00 +0900
t = Time.parse("2017/6/1 7:5"); p t # 2017-06-01 07:05:00 +0900
t = Time.parse("2017-8-1 1:2:3"); p t # 2017-08-01 01:02:03 +0900
t = Time.parse("20170907 122456"); p t # 2017-09-07 12:24:56 +0900
t = Time.parse("20170907123456"); p t # 2017-09-07 12:34:56 +0900
t = Time.parse("2017-9/12 12:34:56"); p t # 2017-09-12 12:34:56 +0900
Time.parse("xoxoxo$$") rescue p $! # #
※引用元はこちら
今回はまず、row[0](日付)をgsubにより、「/」=> 空文字 に置換します。
"2019/03/13" => "20190313"
上記のようになるので、row[1]と結合します。
"20190313" + "143300" => "20190313143300"
先ほどあげた例の t = Time.parse(“20170907123456”); p t のケースに当てはまる形になったので、Time.parseが上手に認識してくれるようになり、日時に変換できるようになりました!
まとめ
ということで、文字列を日付(Time)オブジェクトに変換する方法についてでした。
「配列を分解して間にコロン入れてまた結合してー」など力技でゴリゴリやるところでしたが、最終的にはだいぶマシな感じに記述できてよかったです。
まだまだRubyのメソッドを多く知らないので、都度調査していますが一行でスマートに書きたいものですね。
短いですが、今回はここまで。