一年的周数,有点

时间:2011-07-16 22:44:13

标签: ruby date time

最好是红宝石,但逻辑足够好......

我需要一周的周数,因为这周是非标准的。所以,假设您将一周定义为星期六 - >星期五。然后,给定一个日期,它是哪一周(1-52)?

strftime有%U:

> Time.now.strftime('%U')
> => "28"

...但当然假定标准星期日 - >星期六。

5 个答案:

答案 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

请注意,有几个边缘情况,取决于您选择的周数(处理这些是留给读者的练习)。对于我们周三至周二周:

  • 2014年开始于星期三,但是我们的算法将1月1日放在第0周,但它应该是第1周(%U将1月1日放在第1周,如果是星期天的话)。
  • 2007年(以及从星期一或星期二开始的其他年份)将导致第一个星期三之前的日子在第-1周,但它们应该是第0周。

您调整的一周中的日子越多,您拥有的边缘情况就越多。周六至周五可能会遇到最多的问题,因为你在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。