Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中计算自给定日期起的周数? 客观的_Ruby_Date_Date Arithmetic - Fatal编程技术网

如何在Ruby中计算自给定日期起的周数? 客观的

如何在Ruby中计算自给定日期起的周数? 客观的,ruby,date,date-arithmetic,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

我正在尝试计算自给定日期起的周内的距离,而不需要跳圈。我更喜欢用普通的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需要数周的时间作为其参数,因此它不适合此用例。Ruby的似乎也没有任何相关内容

选择?
有没有更好的内置解决方案或众所周知的算法来计算一对日期之间的间隔周数?我不是想编写这个,因为可读性胜过简洁性,只是想了解Ruby是否支持我手工编写的日期算法。

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

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
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
周内(Rails 6.1+) Rails 6.1引入了新的转换方法,如、、和

因此,现在,您的问题可以通过以下方式解决:

date_1=Time.parse('2020-10-18 00:00:00 UTC'))
date_2=时间解析('2020-08-13 03:35:38 UTC')
(日期2-日期1)。秒。周到周
# => 9

以下是。

全世界的周不是从同一天开始的。你的定义是什么?或者,你所说的周,实际上是指7天吗?例如,基于星期一开始周,2016年1月30日和2016年1月31日属于同一周,但基于星期日开始周,它们属于不同的周。使用时间将是
(t2-t1)/604800
。这是
(60*60*24*7)
=以秒为单位的一周。否则,您的解决方案也会做类似的事情。@sawa我认为他用更纯粹的意义来定义一周,即连续7天。@engineersmnky您是对的。我将周定义为连续7天的时间段,而不是“工作周”或“日历周”。你可以说“以米为单位的距离”或“以周为单位的时间”,但不是“以周为单位的距离”。-)好的,我看到定义了,但即使在阅读了文档之后,我也不确定您的示例为什么有效。
Date#步骤
接受另一个
Date
对象和一个数字。它将返回一个
枚举器
对象,由这两个日期之间的天数差组成
Date#直到(某个日期)
相当于
Date#步骤(某个日期,1)
。需要指出的是,第二个参数与每个步骤的天数有关。这没有很好的文档记录。更准确地说,第一个应该是
Date.parse(str).step(Date.today,7)。count-1
,这样
(Date.current-7.days)。step(Date.current,7)。count-1==1