我似乎无法理解可能是一个简单的问题..
假设我有日期..
Fri, 14 Sep 2012 18:37:50 +0200
我如何知道这个日期是本月的哪一周?是第1个,第2个..?第三?
谢谢!
我似乎无法理解可能是一个简单的问题..
假设我有日期..
Fri, 14 Sep 2012 18:37:50 +0200
我如何知道这个日期是本月的哪一周?是第1个,第2个..?第三?
谢谢!
为什么要使用图书馆?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
sachin87 有一个用于确定此类事情的库。
请注意,这取决于您如何计算周数。假设 6 月 1 日是星期六。你认为 6 月 2 日是哪一周?这可能是第二周,或者如果您认为可数周至少包含 4 天,则可能是第一周。
或者,鉴于 6 月 2 日是星期日,那么该星期日的周数是多少?毫无疑问,这是第一个星期日。如果这就是你的意思,那么它实际上很简单。日期 1 到 7 始终是该月的第一个 [工作日名称]。日期 8-14 始终排在第二位。等等。你所要做的就是建立一个哈希,它可以在任何月份工作。
week_of_month gem看起来可能有点矫枉过正。该实现使用了大量的数组拆分和Array.include?
检查。
相反,这里有一个模块,您可以混入Date
并Time
获得所需的行为。
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
我被挑战回答“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
试试这个,找到 a_date 的星期(考虑第一周是 1,一周的第一天是星期一):
week = (((a_date.mday + Date.new(a_date.year, a_date.month, 1).wday - 1) / 7) + 1)