Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Ruby: strptimeでよく使うテンプレート

更新情報

  • 2016/10/07: 初版公開
  • 2022/07/28: 更新

こんにちは、hachi8833です。昨日のstrftimeテンプレート記事に続き、strptimeのよく使うオプションをテンプレート用にまとめてみました。

query

160914_1648_wKvt8f

注意: コード例はすべてRuby 3.1.2の場合です。

RailsであればActiveSupportを使うことが多いと思いますが、タイムゾーンの扱いに注意する必要があります。

strptime

参考: Ruby API Time.strptime (Ruby 3.1 リファレンスマニュアル) -- 組み込みのTimeクラスではなく、拡張ライブラリです
参考: Ruby API Date.strptime (Ruby 3.1 リファレンスマニュアル)

RubyのTime.strptimeは、日時を表す文字列をTimeオブジェクトに変換し、Date.strptimeは、日時を表す文字列をDateオブジェクトに変換します。名前の「p」の由来は見つけられませんでしたが、parseのpではないかと推測しました。

Time.strptimeTimeクラスを拡張するRubyのライブラリなのでrequire 'time'が必要です。昨日のstrftimeは組み込みのTimeクラスのメソッドですので、その点が異なります。

C言語のstrptime(3)やglibcを参考に作られています。

追記(2020/06/26)

ParseDateは現在のRubyでは使えなくなっています。

参考: Rubyのparsedateは1.9以降使えなくなっていた | Simple is Beautiful.

個別のパラメータについてはRubyのDate._strftime_が付いている点に注意)やC言語のstrptime(3)をご覧ください。

Apacheログなどの「2022-07-28T04:05:06+09:00」を変換したいとき

Time.strptimeの例そのままですが、よく使われるパターンです。

require 'time'
Time.strptime('2022-07-28T04:05:06+09:00', '%Y-%m-%dT%H:%M:%S%z')

#=> 2022-07-28 04:05:06 +0900

「2022年08月28日 12:13:23」を変換したいとき

require 'time'
Time.strptime("2022年08月28日 12:13:23", '%Y年%m月%d日 %H:%M:%S')

#=> 2022-08-28 12:13:23 +0900

ゼロがスペースになっている「2022年 1月 1日 1: 3: 3」を変換したいとき

require 'time'
Time.strptime("2022年 1月 1日  1: 3: 3", '%Y年 %m月 %d日 %H: %M: %S')

#=> 2022-01-01 01:03:03 +0900

少々極端な例ですが、フォーマットの%mなどの前にスペースを置くことで、上位桁のゼロがスペースになっている文字列を変換できます。

以下のように、スペースの部分に数字が入っても正常に処理されます。

require 'time'
Time.strptime("2021年12月31日23:59:59", '%Y年 %m月 %d日 %H: %M: %S')

#=> 2021-12-31 23:59:59 +0900

参考: Time.strptimeメソッド)">日本語表記の日時をTimeオブジェクトに変換(Time.strptimeメソッド)

「2022-07-28 午後 04:18」を変換したいとき

「2022-07-28」の形式にはショートハンドの%Fが便利です。

午前と午後の表示は手を加える必要があります。めったに使わないと思いますが。

require 'time'
datetime = '2022-07-28 午後 04:18'.sub(/午前/, 'AM').sub(/午後/, 'PM')
Time.strptime(datetime, '%F %p %H:%M')

#=> 2022-07-28 16:18:00 +0900

なお、%p%Pでは同じ結果でした。

参考: Railsのstrptime

参考: Rails API strptime -- ActiveSupport::TimeZone

RailsのActiveSupport::TimeZonestrptimeは、ActiveSupport::TimeWithZoneを返します。

Time.zone = 'Hawaii'                   # => "Hawaii"
Time.zone.strptime('2021-12-31 14:00:00', '%Y-%m-%d %H:%M:%S')
#=> Fri, 31 Dec 2021 14:00:00.000000000 HST -10:0

Time.zone.strptime('2021-12-31 14:00:00', '%Y-%m-%d %H:%M:%S').class
#=> ActiveSupport::TimeWithZone

返されるActiveSupport::TimeWithZoneのタイムゾーンは、フォーマットにタイムゾーン指定を含まない限りselfのタイムゾーンが使われます。

Time.zone = 'Hawaii'                   # => "Hawaii"
Time.zone.strptime('2021-12-31 14:00:00 JST', '%Y-%m-%d %H:%M:%S %Z')
#=> Thu, 30 Dec 2021 19:00:00.000000000 HST -10:00

Time.zone.strptime('2021-12-31 14:00:00 JST', '%Y-%m-%d %H:%M:%S')
#=> Fri, 31 Dec 2021 14:00:00.000000000 HST -10:00

関連記事

Ruby: strftimeでよく使うテンプレート

ActiveRecordで日付・時刻の範囲検索をシンプルに書く方法

RailsでTimeZoneを設定する


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。