首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用Date.commercial方法找到第53周的开始

无法使用Date.commercial方法找到第53周的开始
EN

Stack Overflow用户
提问于 2018-06-08 07:34:25
回答 2查看 814关注 0票数 1

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

代码语言:javascript
复制
Date.commercial(2018, 1, 1)
#=> 2018-01-01
Date.commercial(2018, 52, 1)
#=> 2018-12-24

当我试图找出53周的星期一(53周)时,它会抛出错误。

代码语言:javascript
复制
Date.commercial(2018, 53, 1)
# ArgumentError: invalid date

而且,我也不清楚它的定义。就像这两个人的行为是如此不同:

代码语言:javascript
复制
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")的反向函数?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-08 08:00:36

是否有任何方法可以将一年的周数转换为与Date.strftime("%W")一致的周的星期一日期,即Date.strftime("%W")的反向函数?

你可以用strptime

代码语言:javascript
复制
Date.strptime('2018-W53', '%Y-W%W')
#=> #<Date: 2018-12-31 ((2458484j,0s,0n),+0s,2299161j)>

请注意,%W%V (商业周刊)的定义不同,并产生不同的结果。

%W被定义为:

YYYY的第一周从星期一开始。第一周前一年的日子是在第0周。

%V被定义为:

YYYY的第一周从星期一开始,包括YYYY-01-04.第一周前一年的日子是前一年的最后一周。

下面是一些例子:

代码语言:javascript
复制
Date.new(2018,  1,  1).strftime('%Y-W%W / %G-CW%V') #=> "2018-W01 / 2018-CW01"
Date.new(2018, 12, 31).strftime('%Y-W%W / %G-CW%V') #=> "2018-W53 / 2019-CW01"

Date.new(2019,  1,  1).strftime('%Y-W%W / %G-CW%V') #=> "2019-W00 / 2019-CW01"
Date.new(2019, 12, 31).strftime('%Y-W%W / %G-CW%V') #=> "2019-W52 / 2020-CW01"

Date.new(2020,  1,  1).strftime('%Y-W%W / %G-CW%V') #=> "2020-W00 / 2020-CW01"
Date.new(2020, 12, 31).strftime('%Y-W%W / %G-CW%V') #=> "2020-W52 / 2020-CW53"

Date.new(2021,  1,  1).strftime('%Y-W%W / %G-CW%V') #=> "2021-W00 / 2020-CW53"
Date.new(2021, 12, 31).strftime('%Y-W%W / %G-CW%V') #=> "2021-W52 / 2021-CW52"
票数 5
EN

Stack Overflow用户

发布于 2018-06-08 07:48:14

来自API文档:

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

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

代码语言:javascript
复制
Date.commercial(2018, 52, 7)
# => #<Date: 2018-12-30 ((2458483j,0s,0n),+0s,2299161j)> 

随后是2019年的第一周:

代码语言:javascript
复制
Date.commercial(2019, 1, 1)
# => #<Date: 2018-12-31 ((2458484j,0s,0n),+0s,2299161j)> 

你似乎是在2018-12-31是2018年的前提下工作的。不是,不是在商业日期。如果您要使用商业年而不是日历年,那么使用%G而不是%Y来获取商业年,使用%V来代替%W

代码语言:javascript
复制
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"
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50755624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档