通过考虑这个日历片段,我们可以弄清楚如何从%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
假设我们想要一个周三至周二的一周,缩写为 %? 格式(因此我们不必输入“周三开始周”)。
我们想要:
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
请注意,有几个极端情况,具体取决于您选择的一周(处理这些情况留给读者作为练习)。对于我们的周三至周二周:
- 2014 年从星期三开始,但我们的算法将 1 月 1 日放在第 0 周,但应该是第 1 周(
%U 将 1 月 1 日放在第 1 周,如果是星期日)。
- 2007 年(以及从周一或周二开始的其他年份)将导致第一个周三之前的几天在第 -1 周,但它们应该在第 0 周。
一周中调整的天数越多,遇到的边缘情况就越多。周六到周五这周可能遇到的问题最多,因为您在 7 天中有 6 天要调整。