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

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

こんにちは、hachi8833です。

Active Support探訪シリーズは前回「[Rails5] ActiveSupport::Durationの期間処理メソッド(1)演算、比較など」の続きです。

今回のメソッド

ActiveSupport::Durationは日付や時刻による期間(時点と時点の間の大きさ)を表現するライブラリです。

以下もご覧ください。

条件

変換系

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"

秒への変換

メソッド 説明
#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] Railsの主要なライブラリ構成

Rails: ビューのHTMLエスケープは#link_toなどのヘルパーメソッドで解除されることがある


CONTACT

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