INTRODUCTION
「日付」は意外と難しい
Javaで日付を扱うだけなら、 一見すると簡単そうに見えます。
LocalDate today = LocalDate.now();
これで今日の日付を取得できます。
しかし、実際のシステムでは、
- 日付だけ必要なのか
- 時刻まで必要なのか
- タイムゾーンを考える必要があるのか
- 文字列なのか
- DBのデータなのか
- APIから受け取ったデータなのか
という違いがあります。
「日付を扱う」だけではなく、 「どんなデータとして扱うのか」を考える。
これが実務では重要になります。
01
まずはLocalDate
日付だけを扱いたい場合は、
LocalDate が基本になります。
import java.time.LocalDate;
LocalDate today = LocalDate.now();
System.out.println(today);
実行すると、
2026-08-16
のような値になります。
ここには時刻がありません。
例えば、
- 誕生日
- 請求日
- 有効期限
- 営業日
のように、 「日付だけ」が必要な場合に使います。
02
時刻まで必要ならLocalDateTime
日付だけではなく、
時刻まで扱いたい場合は
LocalDateTime を使います。
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
例えば、
2026-08-16T22:30:15.123
のように、 日付と時刻を一緒に持ちます。
例えば、
- 登録日時
- 更新日時
- 処理開始日時
- 処理終了日時
などで使われます。
03
日付や時刻を計算する
Javaでは、 日付を直接書き換えるのではなく、 新しい値を作るように扱います。
例えば1日後です。
LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plusDays(1);
1週間後なら、
LocalDate nextWeek = today.plusWeeks(1);
1か月前なら、
LocalDate previousMonth = today.minusMonths(1);
のように書けます。
plusDays()
→ 日を加える
plusMonths()
→ 月を加える
plusYears()
→ 年を加える
minusDays()
→ 日を引く
04
日付を比較する
業務システムでは、 日付の比較もよく出てきます。
例えば、
LocalDate today = LocalDate.now();
LocalDate deadline =
LocalDate.of(2026, 8, 31);
if (today.isBefore(deadline)) {
System.out.println("期限前");
}
のように、
isBefore() や
isAfter() を使えます。
05
文字列と日付を変換する
実際のシステムでは、 日付がそのままJavaオブジェクトとして 渡されるとは限りません。
例えば、
"2026/08/16"
のような文字列として 受け取ることがあります。
そこで登場するのが
DateTimeFormatter です。
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDate date =
LocalDate.parse(
"2026/08/16",
formatter
);
JavaのLocalDateと
文字列を変換できます。
逆に、 日付を文字列にすることもできます。
String text =
date.format(formatter);
画面・CSV・JSON・APIなどでは
「文字列としての日付」が登場します。
そのため、
String
↔
LocalDate / LocalDateTime
の変換は、
業務システムでよく登場します。
06
LocalDateTimeだけでは足りない場合
ここまでの
LocalDateTime には、
タイムゾーンの情報がありません。
例えば、
LocalDateTime now =
LocalDateTime.now();
これは、
「2026年8月16日の22時30分」
という情報は持っていますが、 それが日本時間なのか、 アメリカ時間なのかまでは分かりません。
タイムゾーンまで扱いたい場合は
ZonedDateTime を使います。
ZonedDateTime now =
ZonedDateTime.now(
ZoneId.of("Asia/Tokyo")
);
海外との連携や、 グローバルなシステムでは この違いが重要になります。
まずは、
LocalDate
→ 日付
LocalDateTime
→ 日付+時刻
ZonedDateTime
→ 日付+時刻+タイムゾーン
くらいで十分です。
07
業務システムでは「システムデータ」として考える
Javaだけで完結するプログラムなら、 日付をJavaオブジェクトとして扱うだけでも問題ありません。
しかし、 業務システムではデータが いろいろな場所を通ります。
画面
↓
Java / Spring
↓
API / JSON
↓
DB
例えばDBに、
2026-08-16 22:30:15
という日時が保存されているとします。
Javaでは
LocalDateTimeとして扱い、
JSONでは文字列として送受信し、
画面では表示用の形式に変換する、
ということがあります。
そのため、 「Javaの日付クラスを覚える」だけではなく、
「この日時データは、システムのどこから来て、どこへ渡るのか?」
という視点を持つと、 業務コードがかなり読みやすくなります。
08
JSONやAPIでは文字列として登場することもある
API連携では、 日付がJSONの文字列として 送られてくることがあります。
{
"createdAt": "2026-08-16T22:30:15"
}
Java側では、 この値を日時として扱えるように 変換します。
Springなどのフレームワークを使うと、 JSONとJavaオブジェクトの変換を 自動で行える場合もあります。
ただし、 「自動で変換されるから何も考えなくていい」 というわけではありません。
例えば、
- 日付のフォーマット
- タイムゾーン
- null
- DB側の型
- API側の仕様
などが一致している必要があります。
日付は「型」だけではなく、 データの形式まで確認する。
09
java.util.Dateを見かけたら
古いJavaコードや、 既存の業務システムを読んでいると、
java.util.Date
が登場することがあります。
現在のJavaでは、
日付・時刻を扱う場合、
java.time パッケージの
クラスを使うのが基本です。
ただし、 実際の開発では古いライブラリや既存システムとの 連携でDateが残っていることもあります。
そのため、
「Dateは古いから知らなくていい」
ではなく、
「新しいコードではjava.timeを使い、 古いコードではDateが出てくることがある」
くらいに理解しておくと、 実務では困りにくくなります。
FIELD NOTE
処理時間を測定する
日付・時刻の話から少しだけ外れますが、 Javaのコードを読んでいると、
System.currentTimeMillis()
や、
System.nanoTime()
を見かけることがあります。
これは、 処理にどのくらい時間がかかったのかを 確認するときに使われます。
currentTimeMillis()で測る
long start = System.currentTimeMillis();
// 処理
long end = System.currentTimeMillis();
System.out.println(
"処理時間:" + (end - start) + " ms"
);
例えば、 DBアクセスやファイル処理などの 大まかな処理時間を確認できます。
nanoTime()で測る
long start = System.nanoTime();
// 処理
long end = System.nanoTime();
System.out.println(
"処理時間:" + (end - start) + " ns"
);
ここで重要なのは、
nanoTime()を
「現在時刻を取得するメソッド」と考えないことです。
System.nanoTime()は、 経過時間を測定するために使う。
例えば、
long start = System.nanoTime();
service.execute();
long elapsed =
System.nanoTime() - start;
System.out.println(
"処理時間:" + elapsed + " ns"
);
のように書けば、
service.execute() が
どのくらいの時間で終了したのかを
測定できます。
nanoTime() の値そのものを
「現在時刻」として使うものではありません。
「開始時点」と「終了時点」の
差を取って、
経過時間を見るために使います。
業務システムでは、
- DBアクセス
- API呼び出し
- 大量データ処理
- ファイル入出力
- バッチ処理
などの処理時間を調べる場面があります。
こうしたコードを見たときに、
「これは日時を取得しているのではなく、 処理時間を測っているんだな」
と判断できると、 業務コードを読むときにも役立ちます。
SUMMARY
今回のポイント
Javaの日付・時刻は、 まず「何を表したいのか」で クラスを選ぶと分かりやすくなります。
LocalDate
→ 日付
LocalDateTime
→ 日付+時刻
ZonedDateTime
→ 日付+時刻+タイムゾーン
DateTimeFormatter
→ 日付・時刻と文字列を変換する
java.time
→ 現在の日付・時刻処理の基本
そして業務システムでは、 日付はJavaの中だけで完結するとは限りません。
DB、
JSON、
API、
画面、
CSV
など、
システムのいろいろな場所を通ります。
「この日付データは、 どこから来て、どこへ渡るのか?」
という視点を持つことが、 実際の開発では大切です。
また、
System.nanoTime()
のようなコードを見たときには、 日付取得ではなく 「処理時間の測定」という 別の目的で使われていることもあります。
まずは、
① 日付だけか?
② 時刻まで必要か?
③ タイムゾーンは必要か?
④ String / JSON / DBなど、
どんなデータとして渡っているか?
⑤ これは日時なのか、
それとも経過時間なのか?
この5つを意識するだけでも、 日付・時刻を扱うコードが かなり読みやすくなります。