在Ruby中添加月份和将月份转换为秒之间有什么区别?

7tofc5zh  于 12个月前  发布在  Ruby
关注(0)|答案(2)|浏览(87)

我有个问题需要回答
当前时间是7/1/2023我想在14个月后显示此日期。
有两种方法,但它们产生两种不同的结果,你能指出这种差异吗?
选项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"
fcy6dtqo

fcy6dtqo1#

首先,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

因此,如果我们查看it类文档,
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.hours将准确地提前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

如果我错了,请纠正我,谢谢。

q3aa0525

q3aa05252#

ActiveSupport::Duration基于1年等于365.2425天(所谓的“平均年”)的假设实现to_i,这是包括闰年时的平均秒数。

365.2425 * 24 * 60 * 60
#=> 31556952.0

1.year.to_i
#=> 31556952

1.month.to_i是该值的1/12:

1.year.to_i / 12
#=> 2629746

1.month.to_i
#=> 2629746

该值相当于30.436875天或30天10小时29分6秒。
在Ruby中添加月份和将月份转换为秒之间有什么区别?
添加1.month只会增加time对象的 month 值,而其他所有值(day、hour、minute、second)保持不变:

time = Time.utc(2024, 8, 30)
# => 2024-08-30 00:00:00 UTC

time + 1.month
#=> 2024-09-30 00:00:00 UTC
#        ^^

而加上1.month.to_i则使其增加上述 * 平均 * 值:

time + 1.month_to_i
#=> 2024-09-29 10:29:06 UTC

相当于:

time + 30.days + 10.hours + 29.minutes + 6.seconds
#=> 2024-09-29 10:29:06 UTC

这同样适用于14.month14.months.to_i,只是14倍

相关问题