5

我似乎无法理解可能是一个简单的问题..

假设我有日期..

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

我如何知道这个日期是本月的哪一周?是第1个,第2个..?第三?

谢谢!

4

6 回答 6

11

为什么要使用图书馆?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 
于 2012-09-14T19:24:53.837 回答
8

sachin87 有一个用于确定此类事情的库。

于 2012-09-14T16:45:57.380 回答
3

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

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

于 2012-09-14T19:00:58.687 回答
2

week_of_month gem看起来可能有点矫枉过正。该实现使用了大量的数组拆分和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
于 2014-07-27T23:58:32.173 回答
1

我被挑战回答“2017 年 6 月 30 日是 2017年 6 月的第 n 个星期五”。

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

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
于 2017-07-19T20:29:31.243 回答
0

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

week = (((a_date.mday + Date.new(a_date.year, a_date.month, 1).wday - 1) / 7) + 1)
于 2017-05-20T04:15:24.973 回答