你如何找到一个月中每周的一周?

时间:2012-09-14 16:38:31

标签: ruby-on-rails ruby

我似乎无法绕过可能是一个简单的问题。

假设我有日期..

Fri, 14 Sep 2012 18:37:50 +0200

如何找出这个月的这个日期是哪个星期?它是第1,第2 ......?第三个?

谢谢!

6 个答案:

答案 0 :(得分:10)

为什么要使用图书馆? Ruby默认拥有它:

Week number:
The week 1 of YYYY starts with a Sunday or Monday (according to %U
  or %W).  The days in the year before the first week are in week 0.
    %U - Week number of the year.  The week starts with Sunday.  (00..53)
    %W - Week number of the year.  The week starts with Monday.  (00..53)

> Time.zone.parse("2012-01-01").strftime("%U")
=> "01" 

因此,鉴于我们可以找到一年中某个特定日期的星期,我们可以做一些数学计算,确定它出现在哪个星期。

> week_of_year_for_first_of_month = Time.zone.parse("2012-07-01").strftime("%U").to_i
> week_of_target_date = Time.zone.parse("2012-07-14").strftime("%U").to_i
> week_occurs_in = week_of_target_date - week_of_year_for_first_of_month + 1
> week_occurs_in # => 2

或方法:

def week_of_month_for_date(date)
  my_date = Time.zone.parse(date)
  week_of_target_date = my_date.strftime("%U").to_i
  week_of_beginning_of_month = my_date.beginning_of_month.strftime("%U").to_i
  week_of_target_date - week_of_beginning_of_month + 1
end

> week_of_month_for_date("2012-07-14") # => 2 
> week_of_month_for_date("2012-07-15") # => 3 

答案 1 :(得分:8)

sachin87有library来确定这样的事情。

答案 2 :(得分:3)

请注意,这取决于您如何计算周数。假设6月1日是星期六。你认为6月2日是几周?这可能是第二周,或者如果您认为可计算的一周至少包含4天,则可能是第一周。

或者,或许,鉴于6月2日是星期天,那个星期天的周数是多少?毫无疑问是第一个星期天。如果这是你的意思,那么它实际上很简单。日期1到7始终是该月的第一个[工作日名称]。 8-14号日期总是第二名。等等。您所要做的就是构建一个哈希值,它可以在任何月份使用。

答案 3 :(得分:2)

week_of_month宝石看起来可能有点矫枉过正。该实现使用了大量的数组拆分和Array.include?检查。

相反,这是一个模块,您可以将其混合到DateTime以获得所需的行为。

require "active_support/core_ext/date"
require "active_support/core_ext/time"

module WeekCalculator
  def week_of_year(mondays = false)
    # Use %U for weeks starting on Sunday
    # Use %W for weeks starting on Monday
    strftime(mondays ? "%W" : "%U").to_i + 1
  end

  def week_of_month(mondays = false)
    week_of_year(mondays) - beginning_of_month.week_of_year(mondays) + 1
  end
end

class Date
  include WeekCalculator
end

class Time
  include WeekCalculator
end

Date.new(2014, 1, 1).week_of_year            # => 1
Date.new(2014, 1, 1).week_of_month           # => 1
Date.new(2014, 7, 1).week_of_year            # => 27
Date.new(2014, 7, 1).week_of_month           # => 1

Date.new(2014, 7, 27).week_of_year           # => 31
Date.new(2014, 7, 27).week_of_month          # => 5
Date.new(2014, 7, 27).week_of_year(:monday)  # => 30
Date.new(2014, 7, 27).week_of_month(:monday) # => 4

答案 4 :(得分:0)

试试这个,找到a_date的一周(考虑第一周是1,周的第一天是星期一):

week = (((a_date.mday + Date.new(a_date.year, a_date.month, 1).wday - 1) / 7) + 1)

答案 5 :(得分:0)

我接受挑战时回答“2017年6月30日是2017年6月的 nth 星期五”。

我通过构建一个包含所有日期名称(星期一,星期二等)的数组来解决这个问题,直到目标日期,并计算匹配的数量。

target_date = Date.new(2017, 6, 30)
(1..target_date.day).select do |day_of_month|
  Date.new(target_date.year, target_date.month, day_of_month).strftime('%A') == target_date.strftime('%A')
end.length