最好是红宝石,但逻辑足够好......
我需要一周的周数,因为这周是非标准的。所以,假设您将一周定义为星期六 - >星期五。然后,给定一个日期,它是哪一周(1-52)?
strftime有%U:
> Time.now.strftime('%U')
> => "28"
...但当然假定标准星期日 - >星期六。
答案 0 :(得分:27)
使用%W
代替%U
,它使用星期一作为一周的第一天。
Time.now.strftime('%W')
答案 1 :(得分:22)
class Date
def sweek
date = self + 1
date.cweek
end
end
# Today is Sunday, 17 July
Date.today.cweek
#=> 28
Date.today.sweek
#=> 29
答案 2 :(得分:3)
也许可以这样做;
def week_dates( week_num )
year = Time.now.year
week_start = Date.commercial( year, week_num, 1 )
week_end = Date.commercial( year, week_num, 7 )
week_start.strftime( "%m/%d/%y" ) + ' - ' + week_end.strftime(
"%m/%d/%y" )
end
答案 3 :(得分:1)
我们可以通过考虑这个日历片段来弄清楚如何将周数从%U
(太阳开始一周)返回的周数转移:
August 2015
Su Mo Tu We Th Fr Sa
1 %U => 30
2 3 4 5 6 7 8 %U => 31
9 10 11 12 13 14 15 %U => 32
让我们想要一个Wed-Tue周,缩写为格式%?
(所以我们不必输入“Wed starts week”)。
我们希望:
August 2015
We Th Fr Sa Su Mo Tu
1 2 3 4 %? => 30
5 6 7 8 9 10 11 %? => 31
12 13 14 15 %? => 32
注意We-Sa如何在两个系统中保持相同的周数,而一周中的所有其他日期都移到%?
的前一周。
所以我们可以这样做:
startd = Date.new(2015, 8, 1)
# show whole month
pp (startd .. (startd >> 1)-1).map {|d|
origw = d.strftime('%U').to_i
# Adjust our new week number if not We-Sa:
neww = ([3, 4, 5, 6].include?(d.wday) ? origw : origw-1)
[d.to_s, origw, neww]
}
如果您想要周六周五,那么您可以在星期六之前减去1:
d.wday == 6 ? origw : origw-1
请注意,有几个边缘情况,取决于您选择的周数(处理这些是留给读者的练习)。对于我们周三至周二周:
%U
将1月1日放在第1周,如果是星期天的话)。您调整的一周中的日子越多,您拥有的边缘情况就越多。周六至周五可能会遇到最多的问题,因为你在7天内调整了6个。
答案 4 :(得分:0)
如果您想要ISO week number,请根据strftime documentation使用%V
示例:
require 'date'
puts DateTime.parse('2018-12-30 23:59:59').strftime('%G-%V')
puts DateTime.parse('2018-12-31 00:00:00').strftime('%G-%V')
结果:
2018-52
2019-01
请注意,该年份使用%G而不是%Y。