はじめに
こんにちは。みんなのウェディングのインフラエンジニア横山です。
この記事はくふうカンパニーアドベントカレンダー23日目になります。
今回はDB連携ジョブフローの管理をbricolageからdigdagに移行するにあたり、週番号について考える必要があったのでそこで得た知見を共有します。
週番号
週番号では、その年の初めての週を第1週として、1週ごとに数えていきます。
52週または53週で1年となります。
2020年12月27日は第何週??
この質問の答えは地域によって変わってきます。
例えば米国での数え方だとこれは2021年の第1週となります。
moment.locale('en');
"en"
moment('2020-12-27').weekYear();
2021
moment('2020-12-27').week();
1
逆にフランスでの数え方だと以下のように2020年の52週となります。
moment.locale('fr');
"fr"
moment('2020-12-27').weekYear();
2020
moment('2020-12-27').week();
52
さらにイスラエルなどのヘブライ語圏での数え方だと、2021年の第1週となります。
moment.locale('he');
"he"
moment('2020-12-27').weekYear();
2021
moment('2020-12-27').week();
1
このような違いはその年の第1週をどのようなルールに則って定めているかによって生まれています。
ルールは以下の通りとなります。
米国 | フランス | イスラエル(ヘブライ語圏) |
---|---|---|
1月1日が含まれる週を第1週 | その年の最初の木曜日が含まれる週を第1週 | その年の最初の金曜日が含まれる週 |
※参考資料 https://www.toishi.info/email/week_calendar_2018.html |
地域によってバラバラですね。
このようにバラバラだと国際取引において不都合が多いということでISO8601で標準化されています。
こちらのルールだと、フランスのようにその年の最初の木曜日が含まれる週を第1週
としています。
米国 | フランス | イスラエル(ヘブライ語圏) | ISO8601 |
---|---|---|---|
1月1日が含まれる週を第1週 | その年の最初の木曜日が含まれる週を第1週 | その年の最初の金曜日が含まれる週 | その年の最初の木曜日が含まれる週を第1週 |
特に理由がなければISO8601に規定された通りその年の最初の木曜日が含まれる週を第1週
とするのが良いかと思います。
moment.jsにはisoWeekYear、isoWeekがあるのでこれを使うと良さそうです。
以下の通りlocale
が米国でも2020年の52週となります。
moment.locale('en');
"en"
moment('2020-12-27').isoWeekYear();
2020
moment('2020-12-27').isoWeek();
52