Rails 3.2.8 – 如何从Rails获取周数?

我想知道如何从Rails获取当前周数,我该如何操作它:

  1. 将周数转换为日期。
  2. 根据周数进行间隔。

谢谢。

使用strftime

%U – 一年中的周数。 这一周从周日开始。 (00..53)
%W – 一年中的周数。 本周从星期一开始。 (00..53)

 Time.now.strftime("%U").to_i # 43 # Or... Date.today.strftime("%U").to_i # 43 

如果您想 43周(或几天,几年,几分钟等)添加到日期,您可以使用由ActiveSupport提供的43.weeks:

 irb(main):001:0> 43.weeks => 301 days irb(main):002:0> Date.today + 43.weeks => Thu, 22 Aug 2013 irb(main):003:0> Date.today + 10.days => Sun, 04 Nov 2012 irb(main):004:0> Date.today + 1.years # or 1.year => Fri, 25 Oct 2013 irb(main):005:0> Date.today + 5.months => Mon, 25 Mar 2013 

你想要远离strftime("%U")"%W"

而是使用Date.cweek

问题是,如果您想要使用一周的数字并将其转换为日期, strftime将不会为您提供可以传递回Date.commercial

Date.commercial期望一系列基于1的值。 Date.strftime("%U|%W")返回一个基于0的值。 你会认为你可以+1它,它会没事的。 这个问题会在一年结束时达到53周。 (就像刚刚发生的……)

例如,让我们看一下2015年12月底以及两个获得周数的选项的结果:

 Date.parse("2015-12-31").strftime("%W") = 52 Date.parse("2015-12-31").cweek = 53 

现在,我们来看看将周数转换为日期……

 Date.commercial(2015, 52, 1) = Mon, 21 Dec 2015 Date.commercial(2015, 53, 1) = Mon, 28 Dec 2015 

如果您盲目地将您传递给Date.commercial的价值+1,那么在其他情况下您最终会得到无效日期:

例如,2014年12月:

 Date.commercial(2014, 53, 1) = ArgumentError: invalid date 

如果您必须将该周数转换回日期,唯一Date.cweek方法是使用Date.cweek

 date.commercial([cwyear=-4712[, cweek=1[, cwday=1[, start=Date::ITALY]]]]) → date Creates a date object denoting the given week date. The week and the day of week should be a negative or a positive number (as a relative week/day from the end of year/week when negative). They should not be zero. 

对于间隔

 require 'date' 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 puts week_dates(22) 

EG:输入(周数):22

产出:06/12/08 – 06/19/08

信用:Siep Korteling http://www.ruby-forum.com/topic/125140

Date#cweek似乎获得了ISO-8601周数(星期一为基础的一周),如strftime中的%V (@Robban在评论中提到)。

例如,我正在写这周的星期一和星期日:

 [ Date.new(2015, 7, 13), Date.new(2015, 7, 19) ].map { |date| date.strftime("U: %U - W: %W - V: %V - cweek: #{date.cweek}") } # => ["U: 28 - W: 28 - V: 29 - cweek: 29", "U: 29 - W: 28 - V: 29 - cweek: 29"]