【Ruby】文字列を日付(Time)オブジェクトに変換する方法

ruby

こんにちは。たなかです。

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が上手に認識してくれるようになり、日時に変換できるようになりました!

まとめ

ruby

ということで、文字列を日付(Time)オブジェクトに変換する方法についてでした。

 

「配列を分解して間にコロン入れてまた結合してー」など力技でゴリゴリやるところでしたが、最終的にはだいぶマシな感じに記述できてよかったです。

まだまだRubyのメソッドを多く知らないので、都度調査していますが一行でスマートに書きたいものですね。

短いですが、今回はここまで。

参考サイト

コメントを残す

メールアドレスが公開されることはありません。