web-dev-qa-db-ja.com

今年の週番号、ちょっと

できればRubyで、しかしロジックは十分に良いでしょう...

週が非標準であることを考えると、その年の週番号が必要です。したがって、週を土曜日->金曜日と定義するとします。次に、日付を指定すると、どの週番号(1-52)ですか?

strftimeには%Uがあります:

> Time.now.strftime('%U')
> => "28"

...しかし、もちろんそれは標準的な日曜日->土曜日の週を想定しています。

27
jsharpe

使用する %W の代わりに %U、月曜日を週の最初の日として使用します。

Time.now.strftime('%W')
27
gioele
class Date
  def sweek
    date = self + 1
    date.cweek
  end
end

# Today is Sunday, 17 July
Date.today.cweek
#=> 28
Date.today.sweek
#=> 29
22
fl00r

多分このようにすることができます。

def week_dates( week_num )
    year = Time.now.year
    week_start = Date.commercial( year, week_num, 1 )
    week_end = Date.commercial( year, week_num, 7 )
    week_start.strftime( "%m/%d/%y" ) + ' - ' + week_end.strftime( 
"%m/%d/%y" )
  end
3
Soner Gönül

このカレンダーフラグメントを検討することにより、%U(Sunが週を開始する)によって返されるものから週番号をシフトする方法を理解できます。

August 2015 Su Mo Tu We Th Fr Sa 1 %U => 30 2 3 4 5 6 7 8 %U => 31 9 10 11 12 13 14 15 %U => 32

%?の形式と略される水-火の週が必要な方法を考えてみましょう(したがって、「水が週を開始する」と入力する必要はありません)。

私たちが欲しい:

August 2015 We Th Fr Sa Su Mo Tu 1 2 3 4 %? => 30 5 6 7 8 9 10 11 %? => 31 12 13 14 15 %? => 32

We-Saが両方のシステムで同じ週番号にとどまり、他のすべての曜日が%?で前の週に移動することに注意してください。

だから私たちはこれを行うことができます:

startd = Date.new(2015, 8, 1)
# show whole month
pp (startd .. (startd >> 1)-1).map {|d|
  origw = d.strftime('%U').to_i
  # Adjust our new week number if not We-Sa:
  neww = ([3, 4, 5, 6].include?(d.wday) ? origw : origw-1)
  [d.to_s, origw, neww]
}

土曜日から金曜日の週が必要な場合は、土曜日以外の日は1を引くことができます。

d.wday == 6 ? origw : origw-1

週の選択に応じて、いくつかのEdgeケースがあることに注意してください(これらの処理は読者の演習として残されています)。水-火の週の場合:

  • 2014年は水で始まりますが、アルゴリズムでは1月1日を第0週に配置しますが、第1週にする必要があります(日曜日の場合、%Uは1月1日を第1週に配置します)。
  • 2007年(および月曜日または火曜日に始まる他の年)では、最初の水曜日の前の日が-1週になりますが、0週になるはずです。

調整する曜日が多いほど、Edgeケースが多くなります。土曜日から金曜日の週は、7日のうち6日を調整しているため、おそらく最も問題が発生します。

1
Kelvin

ISO週番号 必要な場合は strftimeドキュメント に従って%Vを使用します

例:

require 'date'

puts DateTime.parse('2018-12-30 23:59:59').strftime('%G-%V')
puts DateTime.parse('2018-12-31 00:00:00').strftime('%G-%V')

結果:

2018-52
2019-01

%Yではなく%Gを年に使用したことに注意してください。

0
Thiago Falcao