5

簡単な質問かもしれないことに頭を悩ませることができないようです..

日付があるとします..

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

今月のこの日付が何週目かを調べるにはどうすればよいですか? 1位ですか、2位ですか…?第3?

ありがとう!

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日は何週だと思いますか。それは 2 番目の週かもしれませんし、数えられる 1 週間が少なくとも 4 日を含むと考える場合は最初の週かもしれません。

あるいは、6 月 2 日が日曜日であるとすると、その日曜日の週番号は? 間違いなく最初の日曜日です。これがあなたの言いたいことなら、それは実際には簡単です。日付 1 ~ 7 は、常に月の最初の [曜日名] です。日付 8 ~ 14 は常に秒です。等々。ハッシュを作成するだけで、どの月でも機能します。

于 2012-09-14T19:00:58.687 に答える
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
于 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 に答える