Rubyで月を加算することと月を秒に変換することの違いは何ですか?
概要
答えなければならない質問があります。
現在の時刻は 2023/7/1 です。この日付を 14 か月後に表示したいと思います。
2 つの方法がありますが、それぞれ 2 つの異なる結果が得られます。この違いを指摘していただけますか?
オプション 1: 14 か月を秒に変換し、現在の日付に追加します。
[22] pry(main)> (Time.zone.parse("1/7/2023") + 14.months.to_i).to_s
=> "2024-08-30 02:47:24 +0900"
オプション 2: 現在の日付に月を直接加算する
[23] pry(main)> (Time.zone.parse("1/7/2023") + 14.months).to_s
=> "2024-09-01 00:00:00 +0900"
解決策
まず、Time.zone は Ruby の関数ではありません。
Rails https://api.rubyonrails.org/classes/Time.html#method-c-zone から来ています
Time.zone.parse の結果は ActiveSupport::TimeWithZone
Time.zone.parse("1/7/2023").class
=> ActiveSupport::TimeWithZone
したがって、クラスのドキュメントを調べてみると、 + メソッドがあります
https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html#method-i-2B
ドキュメントを見ると、こう書かれていました
# For instance, a time + 24.hours will advance exactly 24 hours, while a
# time + 1.day will advance 23-25 hours, depending on the day.
#
# now + 24.hours # => Mon, 03 Nov 2014 00:26:28.725182881 EST -05:00
# now + 1.day # => Mon, 03 Nov 2014 01:26:28.725182881 EST -05:00
これを見ると、24.hour はちょうど 24 時間進みますが、1.day では 23 ~ 25 時間進みます。同じロジックを使用する場合、月を秒に変換すると、より正確に進みます。
irb(main):005:0> (Time.zone.parse("1/7/2023") + 14.months.to_i)
=> Fri, 30 Aug 2024 02:47:24.000000000 UTC +00:00
irb(main):006:0> Time.zone.parse("1/7/2023") + 14.months
=> Sun, 01 Sep 2024 00:00:00.000000000 UTC +00:00
私が間違っていたら修正してください、ありがとう