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

时间:2012-10-25 19:15:45

标签: ruby ruby-on-rails-3

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

  1. 将周数翻译成日期。
  2. 根据周数制作间隔。
  3. 感谢。

4 个答案:

答案 0 :(得分:44)

使用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

答案 1 :(得分:19)

您希望远离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

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

例如,2014年12月:

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:2)

Date#cweek似乎在strftime中获得了ISO-8601周数(周一周),如%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"]