こんにちは、hachi8833です。昨日のstrftimeテンプレート記事に続き、strptime
のよく使うオプションをテンプレート用にまとめてみました。
strptime
Time.strptime
は、日時を表す文字列をTimeオブジェクトに変換します。名前の「p」の由来は見つけられませんでしたが、parseのpではないかと推測しました。
Time.strptime
はTime
クラスを拡張するRubyのライブラリなのでrequireして使います。昨日のstrftimeは組み込みのTimeクラスのメソッドですので、その点が異なります。
C言語のstrptime(3)やglibcを参考に作られています。
ParseDateモジュールでも同じようなことができます。
個別のパラメータについてはDate#strftimeやstrptime(3)をご覧ください。
Apacheログなどの「2016-10-07T04:05:06+09:00」を変換したいとき
Time.strptimeの例そのままですが、よく使われるパターンです。
require 'time' Time.strptime('2016-10-07T04:05:06+09:00', '%Y-%m-%dT%H:%M:%S%z')
「2016年10月07日 12:13:23」を変換したいとき
require 'time' Time.strptime("2016年10月07日 12:13:23", '%Y年%m月%d日 %H:%M:%S')
ゼロがスペースになっている「2016年 1月 1日 1: 3: 3」を変換したいとき
require 'time' Time.strptime("2016年 1月 1日 1: 3: 3", '%Y年 %m月 %d日 %H: %M: %S')
少々極端な例ですが、フォーマットの%m
などの前にスペースを置くことで、上位桁のゼロがスペースになっている文字列を変換できます。
スペースの部分に数字が入っても正常に処理されます。
参考: 日本語表記の日時をTimeオブジェクトに変換(Time.strptimeメソッド)
「2016-10-07 午後 04:18」を変換したいとき
「2016-10-07」の形式にはショートハンドの%F
が便利です。
午前と午後の表示は手を加える必要があります。めったに使わないと思いますが。
require 'time' datetime = '2016-10-07 午後 04:18'.sub(/午前/, 'AM').sub(/午後/, 'PM') pry(main)> Time.strptime(datetime, '%F %p %H:%M')
なお、%p
と%P
では同じ結果でした。
注意: コード例はすべてRuby 2.3.1の場合です。
RailsであればActiveSupportを使うことが多いと思いますが、タイムゾーンの扱いに注意する必要があります。
参考: Rails4のタイムゾーン、時間周り、ActiveSupportの補足的なメモ