如何计算Ruby中给定日期以来的周数?

时间:2016-01-29 17:20:27

标签: ruby date date-arithmetic

目的

我正在尝试计算 中的距离,因为给定的日期没有跳过箍。我更喜欢用普通的Ruby来做,但ActiveSupport肯定是一个可以接受的替代方案。

我的代码

我写了以下内容,这似乎有效,但对我来说似乎还有很长的路要走。

require 'date'

DAYS_IN_WEEK = 7.0 

def weeks_since date_string
  date  = Date.parse date_string
  days  = Date.today - date
  weeks = days / DAYS_IN_WEEK
  weeks.round 2
end

weeks_since '2015-06-15'
#=> 32.57

ActiveSupport的#weeks_since需要花费数周时间才能成为其论据,因此它不适合此用例。 Ruby的Date class似乎也没有任何相关性。

替代?

是否有更好的内置解决方案或众所周知的算法来计算分隔一对日期的周数?我不打算对此进行编码 - 因为可读性胜过简洁,而只是为了了解Ruby本身是否支持我手工编码的日期算术类型。

3 个答案:

答案 0 :(得分:10)

require 'date'

str = '2015-06-15'

Date.parse(str).step(Date.today, 7).count                  # => 33
Date.parse(str).upto(Date.today).count.fdiv(7).round(2)    # => 32.71

答案 1 :(得分:3)

可能更容易将日期转换为时间,然后将时差除以一周。您可以随意roundceil

def weeks_since(date_string)
  time_in_past = Date.parse(date_string).to_time
  now = Time.now
  time_difference = now - time_in_past
  (time_difference / 1.week).round(2)
end

答案 2 :(得分:3)

in_weeks(Rails 6.1 +)

Rails 6.1引入了新的ActiveSupport::Duration转换方法,例如in_secondsin_minutesin_hoursin_daysin_weeksin_months ,和in_years

结果,现在,您的问题可以解决为:

date_1 = Time.parse('2020-10-18 00:00:00 UTC')
date_2 = Time.parse('2020-08-13 03:35:38 UTC') 

(date_2 - date_1).seconds.in_weeks.to_i.abs
# => 9

这里是a link to the corresponding PR