首页 > 解决方案 > 无法使用 Date.commercial 方法找到第 53 周的开始

问题描述

Date.commercial查找一周开始(星期一)的方法在第 53 周不起作用

Date.commercial(2018, 1, 1)
#=> 2018-01-01
Date.commercial(2018, 52, 1)
#=> 2018-12-24

当我试图找到有 53 周的年份中第 53 周的星期一时,它会引发错误。

Date.commercial(2018, 53, 1)
# ArgumentError: invalid date

另外,我也不清楚它的定义。就像这两者的行为如此不同:

Date.commercial(2015, 1, 1)
#=> 2014-12-29

Date.commercial(2016, 1, 1)
#=> 2016-01-04

我认为这是因为Date.commercial()将周数转换为日期的定义与Date.strftime("%W"). 是否有任何方法可以将年份的周数转换为与 一致的一周中的星期一日期Date.strftime("%W"),即反转函数Date.strftime("%W")

标签: ruby-on-railsrubyruby-on-rails-5week-number

解决方案


来自 API 文档:

一年中的第一个日历周包括该年的第一个星期四。在公历中,这相当于包括 1 月 4 日在内的一周。

因此,2018 年没有53 周。2018年最后一周的最后一天是:

Date.commercial(2018, 52, 7)
# => #<Date: 2018-12-30 ((2458483j,0s,0n),+0s,2299161j)> 

接下来是 2019 年的第一周:

Date.commercial(2019, 1, 1)
# => #<Date: 2018-12-31 ((2458484j,0s,0n),+0s,2299161j)> 

您似乎是在 2018-12-31 是 2018 年的前提下工作的。不是,不是商业日期。如果您要使用商业年而不是日历年,请使用%G, not%Y来获取商业年,并%V使用周而不是%W.

date2018_12_31 = Date.commercial(2019, 1, 1)
date2018_12_31.strftime("%Y %W")                  # WRONG
# => "2018 53"
date2018_12_31.strftime("%G %V")                  # CORRECT
# => "2019 01"

推荐阅读