週番号のつけ方2種類と計算方法¶
海外の人とやりとりしていると、スケジュールを決めるときに「○○年の何週目」という表現を使う場合があります。これを週番号と呼んだりします。この場合、年の1週目をどう定義するかによって、週番号がずれてしまったりします。この週番号の定義の仕方が2種類ありますので、その解説をします。
目次
各方式での年の第1週の定義¶
ISO8601(JIS X 0301)¶
ISO8601の原文は購入しないと読めませんので、 Wikipedia から引用します。
最初の木曜日を含む週が、その年の第1週である。
JIS X 0301はISO8601の翻訳版ですので、ISO8601と同様の定義をしています。以下に引用します。
ある年の最初の暦週はその年の最初の木曜日を含む週であり、その年の最後の暦週は次の年の最初の暦週の一つ前の週である。
そうすると、1月1日を含む週の週番号がその年の1週になるのか、それとも前年の最終週になるのかは、下記の表のようになります。
月 |
火 |
水 |
木 |
金 |
土 |
日 |
|
---|---|---|---|---|---|---|---|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
この週は新年の第1週 |
31 |
1 |
2 |
3 |
4 |
5 |
6 |
この週は新年の第1週 |
30 |
31 |
1 |
2 |
3 |
4 |
5 |
この週は新年の第1週 |
29 |
30 |
31 |
1 |
2 |
3 |
4 |
この週は新年の第1週 |
28 |
29 |
30 |
31 |
1 |
2 |
3 |
この週は旧年の最終週 |
27 |
28 |
29 |
30 |
31 |
1 |
2 |
この週は旧年の最終週 |
26 |
27 |
28 |
29 |
30 |
31 |
1 |
この週は旧年の最終週 |
つまり、週内の前年の日と新年の日の数を比べて、新年の日が多くなった週をその年の第1週とするわけですね。1月1日が土曜日だったりする週に、「今週は新年の1週目だから」といわれてもしっくりきませんからね。
US方式¶
US方式がどういった規定に基づくものかネットで調べる限りはわかりませんでした。ということで、やはり Wikipedia を参照します。Wikipediaの英語版のページを意訳すると、1月1日を含む週を最初の週とします。
日 |
月 |
火 |
水 |
木 |
金 |
土 |
|
---|---|---|---|---|---|---|---|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
この週は新年の第1週 |
31 |
1 |
2 |
3 |
4 |
5 |
6 |
この週は新年の第1週 |
30 |
31 |
1 |
2 |
3 |
4 |
5 |
この週は新年の第1週 |
29 |
30 |
31 |
1 |
2 |
3 |
4 |
この週は新年の第1週 |
28 |
29 |
30 |
31 |
1 |
2 |
3 |
この週は旧年の第1週 |
27 |
28 |
29 |
30 |
31 |
1 |
2 |
この週は旧年の第1週 |
26 |
27 |
28 |
29 |
30 |
31 |
1 |
この週は旧年の第1週 |
明快ですね。この定義だと、何も悩むこと無くいつ第1週かがわかります。
週の始まりについても注意が要る¶
上記の2つの表を見ると、ISO8601の方は月曜日から、US方式は日曜日から始まる表になっています。週の初日をどうするかも両者で異なるので、注意が要ります。
ISO8601(JIS X 0301) : 週の開始は月曜日
US方式 : 週の開始は日曜日
日本でも一般的なカレンダーの一週間は日曜始まりですが、手帳などの仕事のカレンダーだと月曜始まりだったりしますね。
PCは週番号をどう計算するか¶
Excelの場合¶
Excelのシートで週番号を計算する場合は、WEEKNUM関数を使用します。Excel 2013の場合は、WEEKNUM関数にどちらの方式で計算するかを指定できます。
WEEKNUM(日付,週の基準)
週の基準に1を指定するとUS方式、21を指定するとISO8601方式になります。省略した場合は、1が指定されたものとして計算されます。
例えば、下記の式の計算結果はいずれも1になります。
=WEEKNUM("2016/1/1")
=WEEKNUM("2016/1/1",1)
ところが、下記の式で計算すると結果は53になります。
=WEEKNUM("2016/1/1",21)
2016年1月1日(金)は、US方式では第1週に属し、ISO8601では前年の最終週(第53週)に属しますから。
C#の場合¶
Visual Studio 2015 Express for Windows Desktop (C#)で Calendar.GetWeekOfYear メソッド を使って週番号を計算してみます。
このメソッドの第1引数は計算対象とする日付(DateTime型)、第2引数は週番号の定義を表す CalenderWeekRule列挙体 、第3引数は週の始まりの曜日を表すDayOfWeek列挙体です。
コンソールアプリで、2016年1月1日の週番号を計算してみました。
using System;
using System.Globalization;
namespace weeknum_trial
{
class Program
{
static void Main(string[] args)
{
DateTime calculationDate = new DateTime(2016, 1, 1);
Calendar calenderCalc = CultureInfo.CurrentCulture.Calendar;
int usWeekNumber = calenderCalc.GetWeekOfYear(calculationDate, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
int isoWeekNumber = calenderCalc.GetWeekOfYear(calculationDate, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
Console.WriteLine("US方式 " + usWeekNumber);
Console.WriteLine("ISO方式 " + isoWeekNumber);
}
}
}
出力結果は下図の様になります。
Microsoftはアメリカの会社ですから、US方式がデフォルトなのですね。週番号と週の開始日の考え方は各地域の習慣に根差したものなので、週番号を使ってコミュニケーションをとる場合はどの方式で計算するか意識を合わせるように心がけないといけませんね。
最終週の週番号を計算する¶
週番号で数えると、1年は52週の場合と53週の場合があります。そこで、その年の最終週を計算してみます。
ISO方式の場合、1月4日を含む週がその年の第1週で、その前週が前の年の最終週です。ということは1月4日の1週間前の日(12月28日)を含む週が、前の年の最終週だということですね。
ということで、Excelだったら下記のようにすれば最終週を計算できます。2つめの引数の21は、ISO方式で計算せよという指定です。
=WEEKNUM("2016/12/28",21)
US方式の週番号の場合は1月1日を含む週がその年の第1週ですので、その1週間前の12月25日を含む週が前の年の最終週になります。2つめの引数の1は、US方式で週を日曜始まりで計算せよという指定です。
=WEEKNUM("2016/12/25",1)
公開日