できればRubyで、しかしロジックは十分に良いでしょう...
週が非標準であることを考えると、その年の週番号が必要です。したがって、週を土曜日->金曜日と定義するとします。次に、日付を指定すると、どの週番号(1-52)ですか?
strftimeには%Uがあります:
> Time.now.strftime('%U')
> => "28"
...しかし、もちろんそれは標準的な日曜日->土曜日の週を想定しています。
使用する %W
の代わりに %U
、月曜日を週の最初の日として使用します。
Time.now.strftime('%W')
class Date
def sweek
date = self + 1
date.cweek
end
end
# Today is Sunday, 17 July
Date.today.cweek
#=> 28
Date.today.sweek
#=> 29
多分このようにすることができます。
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
このカレンダーフラグメントを検討することにより、%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ケースがあることに注意してください(これらの処理は読者の演習として残されています)。水-火の週の場合:
%U
は1月1日を第1週に配置します)。調整する曜日が多いほど、Edgeケースが多くなります。土曜日から金曜日の週は、7日のうち6日を調整しているため、おそらく最も問題が発生します。
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を年に使用したことに注意してください。