我似乎无法绕过可能是一个简单的问题。
假设我有日期..
Fri, 14 Sep 2012 18:37:50 +0200
如何找出这个月的这个日期是哪个星期?它是第1,第2 ......?第三个?
谢谢!
答案 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?
检查。
相反,这是一个模块,您可以将其混合到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
答案 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