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

Tod*_*obs 6 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
Run Code Online (Sandbox Code Playgroud)

ActiveSupport的#weeks_since需要花费数周作为参数,因此它不适合这个用例.Ruby的Date类似乎也没有任何相关性.

备择方案?

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

sbs*_*sbs 11

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
Run Code Online (Sandbox Code Playgroud)

  • 更准确地说,第一个应该是“Date.parse(str).step(Date.today, 7).count - 1”,这样“(Date.current - 7.days).step(Date.current, 7).count - 1 == 1` (2认同)

小智 6

可能更容易将日期转换为时间,然后将时差除以一周。您可以round随心所欲或ceil.

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
Run Code Online (Sandbox Code Playgroud)


Mar*_*n13 5

in_weeks (Rails 6.1+)

Rails 6.1 引入了新的ActiveSupport::Duration转换方法,如in_secondsin_minutesin_hoursin_daysin_weeksin_monthsin_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
Run Code Online (Sandbox Code Playgroud)

这是相应 PR 的链接