こんにちは、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番目の引数です。これについては別記事で追ってみたいと思います。