RACCOON TECH BLOG

株式会社ラクーンホールディングスのエンジニア/デザイナーから技術情報をはじめ、世の中のためになることや社内のことなどを発信してます。

Javaでハマりがちな日付の罠!「YYYY」と「yyyy」の違いと週番号の活用

暦週の基準年!!?

最近近くが全然見えなくなりました。
昔は40歳で初老、50台は中老と呼んでいたそうで、自分の年代を表すのに老の文字が入ると老いを益々実感しますね。
中老エンジニアのKです。
今回は週番号と暦週の基準年について書いてみました。

年末に遭遇しがちな日付のバグ、それはなぜ起こる?

「帳票の日付がおかしいんだけど?」といった問い合わせを頂いたことがある方も少なくないと思いますが、Javaのシステムで年末に「年の記載がおかしいんだけど」と頂くと、思いつくのはアレです。
「帳票の日付がおかしい、1年先になっている」と言われたら、ほぼアレと思って間違いないでしょう。

原因(アレ)

Javaで日付を文字列に変換する際にパターンを指定します。

 LocalDate.of(2025,12,28).format(DateTimeFormatter.ofPattern("YYYY"));

ロケールが日本の場合、このコードは何が返ると思います?  
- 「2025」?惜しい。
- 正解は「2026」

日付を文字に変換する際にDateTimeFormatterを利用しますが、このミスはよくあるケースです。
このバグは困ったことに、年末が近付くと発現するという嫌な特徴があります。

JavaのDateTimeFormatterやSimpleDateFormatのドキュメントを確認してみましょう。
どちらも値は「年」で、知らない人には「?」となりますね。
カレンダーの年を取得する場合は、小文字のyyyyを指定しないといけません。

文字 日付のコンポーネント 表示
Y 暦週の基準年
y

週番号って何?

フォーマットの指定で「暦週の基準年」を使わないように気を付ければ良いだけなのですが、なぜそこに気が回らないのでしょうか?
他の言語だとYYYYでカレンダー上の年が取れるのもあるのですが、「暦週の基準年」の存在を知らないことも大きいのかも知れません。
そこで今回は「暦週の基準年」と「週番号」を皆さんに知ってもらおうと思います。

社会人でも「暦週の基準年」を知らない人が多いかもしれません。
これは日本で「週番号」があまり利用されておらず、なじみがない事が大きな要因だと思ってます。
外資系企業にお勤めの方や、プロジェクト管理をしているような方は利用しているかもしれません。

まずは「週番号」を知りましょう。
海外では一般的に使われていて、googleカレンダー(Web版)等でも普通に表示されていますし、海外のカレンダーでは週番号が記載されているものが割と多い気がします。  

週番号とはその名の通り、1週間に番号を付けて、1年間を52週または53週で管理する方法です。
ISO8601で定義されていて、「その年の最初の木曜日を含む週」または「その年の1月4日を含む週」が第1週となります。
2026/1/1は木曜日です。日曜から週が始まる場合、2025/12/28は2026年の第一週となります。

日曜始まり
図1 googleカレンダーの週番号(日曜始まり)

暦週の基準年

上で既に述べてしまいましたが、週番号の基準年のことを「暦週の基準年」といいます。
年末の日付によっては翌年の第1週に属すため、カレンダーの年と暦週の基準年は違うことがあります。
(年末年始の日付のみ、カレンダーの年と暦週の基準年で違うことがある、ということです)

週の始まりについては少し注意が必要で、ヨーロッパでは月曜日が週の始まりというのが主流だそうです。実はISO8601では週の始まりを月曜日と定めています。
日本のカレンダーでは日曜日から始まるものも多いのですが、週の始まりは国により違うことがあるので気を付けましょう。

月曜始まり
図2 googleカレンダーの週番号(月曜始まり)

意外と便利な週番号

週番号は使ってみるとかなり便利です。
月の日数は28日だったり30日や31日がありますが、1週間は必ず7日で固定されています。
1週間単位でスケジュールを意識すると、翌週にずれても7日程度の差異になります。
「今月中」が「来月」になると30日程度のずれがあり、月単位の話でも大日程レベルでは良いのでしょうが、さすがに進捗管理する上では単位が粗すぎます。

最近流行りのスクラム開発等でも、1週間~2週間の期間を1スプリントとして扱うのは使い勝手が良いのだと思います。
更に合理的な事を言えば、スプリント名に週番号を付けることでスプリントの名前だけで期間も分かります。
「スプリントに名前を付けよう」という流れとも共存は可能で、「スプリント2023W3_ユーザー登録機能」や「スプリント2024W20_モブワーク強化週間」などと付けると、主な取り組みの内容と期間が名前から得られます。

まとめ

この記事が皆さんの開発現場での日付バグ撲滅や、より効率的なプロジェクト管理の一助となれば幸いです。

一緒にラクーンのサービスを作りませんか? 採用情報を詳しく見る

関連記事

運営会社:株式会社ラクーンホールディングス(c)2000 RACCOON HOLDINGS, Inc