こんにちは、hachi8833です。昨日のstrftime
テンプレート記事に続き、strptime
のよく使うオプションをテンプレート用にまとめてみました。
注意: コード例はすべて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.strptime
はTime
クラスを拡張するRubyのライブラリなのでrequire 'time'
が必要です。昨日のstrftime
は組み込みのTimeクラスのメソッドですので、その点が異なります。
C言語のstrptime(3)やglibcを参考に作られています。
追記(2020/06/26)
ParseDate
は現在のRubyでは使えなくなっています。
個別のパラメータについては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::TimeZone
のstrptime
は、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
更新情報