aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/core_ext/integer/time.rb
diff options
context:
space:
mode:
authorAndrey Novikov <envek@envek.name>2017-01-09 01:43:49 +0300
committerAndrey Novikov <envek@envek.name>2017-01-09 23:04:48 +0300
commitcb9d0e4864fa68fad9c49b880c32e90ddf0545bd (patch)
tree4e6b00404b69cb0d9b08ad3c413c5c27027a5dba /activesupport/lib/active_support/core_ext/integer/time.rb
parent3bc747bd8676dc940b531067e2861dcd4ac28efc (diff)
downloadrails-cb9d0e4864fa68fad9c49b880c32e90ddf0545bd.tar.gz
rails-cb9d0e4864fa68fad9c49b880c32e90ddf0545bd.tar.bz2
rails-cb9d0e4864fa68fad9c49b880c32e90ddf0545bd.zip
Fix inconsistent results when parsing large durations and constructing durations from code
ActiveSupport::Duration.parse('P3Y') == 3.years # It should be true Duration parsing made independent from any moment of time: Fixed length in seconds is assigned to each duration part during parsing. Changed duration of months and years in seconds to more accurate and logical: 1. The value of 365.2425 days in Gregorian year is more accurate as it accounts for every 400th non-leap year. 2. Month's length is bound to year's duration, which makes sensible comparisons like `12.months == 1.year` to be `true` and nonsensical ones like `30.days == 1.month` to be `false`. Calculations on times and dates with durations shouldn't be affected as duration's numeric value isn't used in calculations, only parts are used. Methods on `Numeric` like `2.days` now use these predefined durations to avoid duplicating of duration constants through the codebase and eliminate creation of intermediate durations.
Diffstat (limited to 'activesupport/lib/active_support/core_ext/integer/time.rb')
-rw-r--r--activesupport/lib/active_support/core_ext/integer/time.rb4
1 files changed, 2 insertions, 2 deletions
diff --git a/activesupport/lib/active_support/core_ext/integer/time.rb b/activesupport/lib/active_support/core_ext/integer/time.rb
index 4a64872392..66ac3ca1b4 100644
--- a/activesupport/lib/active_support/core_ext/integer/time.rb
+++ b/activesupport/lib/active_support/core_ext/integer/time.rb
@@ -18,12 +18,12 @@ class Integer
# # equivalent to Time.now.advance(months: 4, years: 5)
# (4.months + 5.years).from_now
def months
- ActiveSupport::Duration.new(self * 30.days, [[:months, self]])
+ ActiveSupport::Duration.new(self * ActiveSupport::Duration::PARTS_IN_SECONDS[:months].to_i, [[:months, self]])
end
alias :month :months
def years
- ActiveSupport::Duration.new(self * 365.25.days.to_i, [[:years, self]])
+ ActiveSupport::Duration.new(self * ActiveSupport::Duration::PARTS_IN_SECONDS[:years].to_i, [[:years, self]])
end
alias :year :years
end