[Rails5] ActiveSupport::Durationの期間処理メソッド(2)変換

こんにちは、hachi8833です。 Active Support探訪シリーズは前回「[Rails5] ActiveSupport::Durationの期間処理メソッド(1)演算、比較など」の続きです。 今回のメソッド ActiveSupport::Durationは日付や時刻による期間(時点と時点の間の大きさ)を表現するライブラリです。 メソッド: ActiveSupport::Duration以下のメソッド ディレクトリ配置: https://github.com/rails/rails/blob/5-0-stable/activesupport/lib/active_support/duration.rb 歴史: Rails 2.0より導入 以下もご覧ください。 [Rails5] ActiveSupport::Durationの期間処理メソッド(1)演算、比較など 週刊Railsウォッチ: Railsで月と年を含む期間の扱いを修正 週刊Railsウォッチ: ISO 8601ベースのActiveSupport::Duration 条件 Railsバージョン: 5-0-stable Rubyバージョン: 2.4.0 変換系 ISO8601関連 メソッド 説明 #parse ISO8601形式の文字列からDurationオブジェクトを作成する #iso8601 DurationオブジェクトをISO8601形式の文字列に変換する(precisition:で精度のフォーマットを指定できる) 2つのメソッドは互いに逆変換になっています。 使い方はテストコードを見るのが早いです。 ActiveSupport::Duration.parse(“P1Y1MT8.55S”) #=> 1 year, 1 month, and 8.55 seconds aa.class #=> ActiveSupport::Duration aa.iso8601 precision: 3 #=> “P1Y1MT8.550S” 参考: Wikipedia: ISO 8601 — Durations 参考: P2Y3DT6H8M!? この暗号を解読するための ISO 8601 duration specification とは 秒への変換 メソッド 説明 #to_i Durationを秒(Integer)に変換する #to_s Durationを秒(String)に変換する 1.minute.to_i # => 60 1.hour.to_i # => 3600 1.day.to_i # => 86400 先々週の週刊Railsウォッチでもお伝えしましたが、現時点ではRails 5.0のstableとmaster(5.1になる予定)で月と年の日数の扱いが変わります。 5.0 stable(古くなる) 1か月: 30日 1年: 365.25日 # 30.days.to_iと同等 1.month.to_i # => 2592000 # 365.25.days.to_iと同等 1.year.to_i # => 31557600 5.0 master(5.1になる予定) 1か月: 1年の1/12 1年: 365.2425日 # (1.year / 12).to_iと同等 1.month.to_i # => 2629746 # 365.2425.days.to_iと同等 1.year.to_i # => 31556952 注: 上は現状のRails 5.0 master + Ruby 2.5.0-devで確認しました。 その他の変換 メソッド 説明 #hash Object#hashを呼んでハッシュ値を得る du = ActiveSupport::Duration.parse(“P1Y1MT8.55S”) #=> 1 year, 1 month, and 8.55 seconds du.hash #=> 3607471078652929564 このハッシュ値はHashクラスで使用できます。戻り値はRuby 2.4ではInteger、Ruby 2.3以前はFixnum#hashです。 #valueと#parts ※直接利用するものではないので参考までに。 メソッド 説明 #parts @partsへのアクセス #value @valueへのアクセス 説明がまったくありませんが、@valueはDurationオブジェクトの1番目の引数、@partsは2番目の引数です。これについては別記事で追ってみたいと思います。 関連記事 [Rails5] ActiveSupport::Durationの期間処理メソッド(1)演算、比較など [Rails5] Active Support Core ExtensionsのStringの小粒なメソッドたち: 文字列定数は#freezeしよう [Rails5] Active Support Core ExtensionsのString#inquiryでメタプログラミング [Rails5] Active Support::Inflectorの便利な活用形メソッド群 … Continue reading [Rails5] ActiveSupport::Durationの期間処理メソッド(2)変換