JavaのLocalDateTimeクラスwithHourメソッド完全ガイド!初心者でもわかる日付と時刻の操作
生徒
「先生、Javaで日時を扱うときにLocalDateTimeクラスを使うって聞いたんですが、時間を変更するにはどうしたらいいんですか?」
先生
「いい質問ですね。Javaのjava.timeパッケージに含まれるLocalDateTimeクラスには、withHourという便利なメソッドが用意されていて、簡単に時刻の『時間部分』だけを変更することができるんです。」
生徒
「へえ!部分的に変えられるんですね。じゃあ実際にどうやって使うんですか?」
先生
「ではこれから、withHourメソッドの仕組みや使い方を一緒に見ていきましょう。」
1. java.timeパッケージとは?
「1. java.timeパッケージとは?」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。
Javaには日時を扱うためのパッケージがいくつかありますが、その中でもjava.timeはJava8から導入された新しい日付と時刻のAPIを提供するパッケージです。従来のDateやCalendarクラスに比べて、コードが分かりやすく、安全に扱えるという特徴があります。特に初心者が混乱しやすい『月が0から始まる問題』なども解決されています。開発現場でもjava.timeの利用が推奨されているため、学んでおくと必ず役に立ちます。
2. LocalDateTimeクラスの役割
LocalDateTimeクラスは、日付と時刻を同時に扱えるクラスです。例えば「2025年9月23日15時30分」のような情報を一つのオブジェクトで表現できます。ここで重要なのは、LocalDateTimeが『タイムゾーンを持たない』という点です。つまり、UTCやJSTといった地域情報を含まない純粋な日付と時間を扱います。そのため、シンプルに日時を操作したいときに非常に便利です。
3. withHourメソッドとは?
withHourメソッドは、LocalDateTimeオブジェクトが持つ『時間(Hour)』の部分だけを指定した値に変更するためのメソッドです。他の部分、例えば年や月、日や分や秒などはそのまま残して、時間だけを変更できます。実務でよくある「開始時間だけ変えたい」「処理を朝9時に固定したい」といった場面で役立ちます。
4. withHourメソッドの基本構文
「4. withHourメソッドの基本構文」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。
それでは基本的な使い方を確認しましょう。
import java.time.LocalDateTime;
public class LocalDateTimeWithHourExample {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
LocalDateTime modified = now.withHour(10);
System.out.println("現在の日時: " + now);
System.out.println("変更後の日時: " + modified);
}
}
現在の日時: 2025-09-23T15:45:12.345
変更後の日時: 2025-09-23T10:45:12.345
このように、withHour(10)とすることで、日付や分や秒はそのままに、時間だけを午前10時に変更できます。
5. 不変オブジェクトとしての特徴
初心者がよく疑問に思うのは「元のオブジェクトは変わるのか?」という点です。LocalDateTimeは不変クラス(Immutable Class)なので、withHourを呼び出しても元のオブジェクトは変更されません。常に新しいLocalDateTimeオブジェクトが生成されるので、安心して利用できます。これはスレッドセーフにもつながる大事な設計思想です。
6. withHourの注意点
withHourに渡せる値は0から23の範囲です。それ以外の値を指定するとDateTimeExceptionが発生します。例えば25を指定するとエラーになります。プログラムで扱う際には必ず有効範囲を意識しましょう。また、午前午後の区別も自分で数値を設定する必要があります。午前10時なら10、午後3時なら15という形で24時間表記を使います。
7. 他のwith系メソッドとの組み合わせ
「7. 他のwith系メソッドとの組み合わせ」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。
withHourだけでなく、withMinuteやwithSecondなど、LocalDateTimeには他の部分を変更できる便利なメソッドがそろっています。例えば「時間を9時、分を30分に変更する」といった処理も、組み合わせて書けます。日時操作を柔軟に行えるので、システム開発では非常によく使われます。
8. 実用例:業務システムでの活用
例えば勤怠管理システムを作る場合、打刻の時間を一定の時刻に丸めたいときがあります。「9時以降は遅刻」と判定したい場合には、基準時間をwithHour(9)で作って比較すれば簡単に判定できます。また、予約システムやスケジューラでは開始時間を固定しておきたい場面が多いため、withHourを活用するとコードがすっきり書けます。
9. よくある初心者の疑問
よくあるのは「午前午後で間違えやすい」という点です。特に午後1時をwithHour(1)としてしまうと午前1時に変わってしまいます。必ず24時間表記で設定することを忘れないようにしましょう。また「分や秒も同時に変えたい」というケースではwithHourだけではなく、withMinuteやwithSecondも併用する必要があります。
10. まとめて身につけるポイント
「10. まとめて身につけるポイント」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。
ここまで紹介してきたように、java.timeパッケージのLocalDateTimeクラスとwithHourメソッドは、日付と時刻を自在に操作するための基礎です。初心者でも理解しやすく、実務での応用範囲も広いため、必ず覚えておきたいテクニックです。他のメソッドと組み合わせて練習すると、時間操作に自信がつくでしょう。
まとめ
LocalDateTimeとwithHourメソッドの基本を振り返ろう
JavaのLocalDateTimeクラスは、日付と時刻をまとめて扱うための便利なクラスです。年月日だけでなく、時分秒まで含めた日時情報を1つのオブジェクトとして扱えるため、予約システム、勤怠管理システム、スケジュール管理、ログ記録、締切日時の管理など、さまざまな場面で利用できます。今回学習したwithHourメソッドは、そのLocalDateTimeの中にある時間部分だけを変更するためのメソッドです。
withHourメソッドを使うと、年、月、日、分、秒、ナノ秒などはそのまま残し、時だけを指定した値に置き換えることができます。たとえば、現在の日時をもとにして時間だけを9時にしたい場合や、予約開始時刻を10時に固定したい場合、業務開始時刻を9時として比較したい場合などに役立ちます。Java初心者にとって、日時の一部分だけを変更できるという考え方はとても大切です。
java.timeパッケージはJava8から導入された新しい日付と時刻のAPIです。従来のDateやCalendarよりも読みやすく、安全に日時を扱えるように設計されています。LocalDateTime、LocalDate、LocalTimeなどのクラスを目的に応じて使い分けることで、日付だけ、時刻だけ、日時全体といった処理を整理しやすくなります。
withHourは元の日時を変更しない
withHourメソッドを使うときに必ず理解しておきたいのが、LocalDateTimeは不変オブジェクトであるという点です。不変オブジェクトとは、一度作成された値が後から変更されないオブジェクトのことです。withHourを呼び出しても、元のLocalDateTimeが直接書き換わるわけではありません。時間を変更した新しいLocalDateTimeが返されます。
そのため、変更後の日時を使いたい場合は、戻り値を新しい変数に代入する必要があります。初心者のうちは、withHourを呼び出せば元の変数が変わると思ってしまうことがあります。しかし、実際には新しい日時オブジェクトを受け取らないと、変更後の値は利用できません。この考え方は、plus、minus、withMinute、withSecondなど、java.timeパッケージの多くのメソッドでも共通しています。
import java.time.LocalDateTime;
public class LocalDateTimeWithHourSummary {
public static void main(String[] args) {
LocalDateTime base = LocalDateTime.of(2025, 9, 23, 15, 45, 12);
LocalDateTime changed = base.withHour(9);
System.out.println("元の日時: " + base);
System.out.println("変更後の日時: " + changed);
}
}
元の日時: 2025-09-23T15:45:12
変更後の日時: 2025-09-23T09:45:12
このサンプルでは、元の日時は15時45分12秒のまま残り、変更後の日時だけが9時45分12秒になっています。つまり、withHourは時間だけを変更した新しい日時を作るメソッドです。元の値を残せるため、比較用の基準日時を作ったり、変更前と変更後をログに出したりする場面でも便利です。
withHourで指定できる値と注意点
withHourに指定できる値は0から23までです。JavaのLocalDateTimeでは、時間は24時間表記で扱います。午前0時なら0、午前9時なら9、午後3時なら15、午後11時なら23です。午後1時を1と書いてしまうと午前1時になるため注意が必要です。特に初心者は、午前午後の感覚で値を入れてしまいやすいため、必ず24時間表記で考えるようにしましょう。
もしwithHourに24や25のような範囲外の値を指定すると、DateTimeExceptionが発生します。日時処理では入力値が正しいかどうかを確認することが大切です。画面入力や外部データから時間を受け取る場合は、0から23の範囲に収まっているかをチェックしてからwithHourに渡すと、安全なプログラムになります。
また、withHourは時間だけを変更するメソッドです。分や秒も変更したい場合は、withMinuteやwithSecondを組み合わせます。たとえば、ある日付の時刻を9時30分0秒にしたい場合は、withHour、withMinute、withSecondを順番に使うことで、目的の日時を作れます。
実務でwithHourが役立つ場面
withHourメソッドは、業務システムでも多くの場面で活用できます。勤怠管理システムでは、出勤時刻が9時を過ぎているかどうかを判定するために、基準時刻を作ることがあります。予約システムでは、予約開始時間を10時に固定したり、終了時間を18時に設定したりすることがあります。スケジューラでは、処理実行時刻を毎日決まった時間にそろえることもあります。
たとえば、現在の日付を使いながら、時刻だけを9時に変更して基準日時を作れば、現在時刻との比較がしやすくなります。年、月、日はそのままにして時間だけを変更できるため、同じ日の中で時間判定を行う処理に向いています。日付と時刻を手作業で組み直すよりも、withHourを使うほうが読みやすく安全です。
Webアプリケーションでは、利用者が入力した日時を補正する場面もあります。たとえば、日付だけを選択させ、時刻はシステム側で9時に固定する場合、LocalDateTimeに変換した後でwithHourを使うと分かりやすい処理になります。分や秒も固定したい場合はwithMinuteやwithSecondを組み合わせることで、さらに実務的な日時操作ができます。
他のwith系メソッドと一緒に覚えよう
LocalDateTimeにはwithHour以外にも、withMinute、withSecond、withNano、withYear、withMonth、withDayOfMonthなど、日時の一部分を変更するためのメソッドがあります。これらを組み合わせることで、日時の特定部分だけを安全に変更できます。たとえば、日付はそのままで時刻だけを9時30分にする、年月日はそのままで秒だけを0にする、といった処理が可能です。
java.timeのwith系メソッドは、変更したい部分だけを明示できるため、コードを読む人にも意図が伝わりやすくなります。これはチーム開発でも重要です。日時処理は少しの勘違いで不具合につながりやすいため、分かりやすいメソッドを使って処理の意図を表現することが大切です。
今回の記事では、java.timeパッケージ、LocalDateTimeクラス、withHourメソッド、不変オブジェクト、24時間表記、DateTimeException、withMinuteやwithSecondとの組み合わせ、勤怠管理や予約システムでの活用方法を学びました。これらを理解すると、Javaの日時操作をより正確に書けるようになります。
Javaで日時を扱うときは、どの部分を変更したいのかを明確にすることが大切です。日付を変更したいのか、時間を変更したいのか、分や秒も調整したいのかによって使うメソッドが変わります。withHourは時間部分だけを変更するシンプルなメソッドですが、実務では基準時刻の作成や時刻補正に役立つ重要な機能です。初心者のうちにしっかり理解しておくと、日時処理への苦手意識が減り、より実践的なJavaプログラムを書けるようになります。
生徒
「withHourメソッドを使うと、LocalDateTimeの時間部分だけを変更できるんですね。」
先生
「その通りです。年、月、日、分、秒はそのままで、時だけを指定した値に変更できます。」
生徒
「元のLocalDateTimeも変わるのかと思っていました。」
先生
「LocalDateTimeは不変オブジェクトなので、元の値は変わりません。変更後の新しい値を変数で受け取ります。」
生徒
「withHourに指定できるのは0から23までなんですね。」
先生
「はい。24時間表記なので、午後3時は15、午後11時は23と指定します。」
生徒
「範囲外の値を入れるとDateTimeExceptionが出ることも覚えておきます。」
先生
「良い理解です。画面入力などから受け取る場合は、値の範囲チェックも大切です。」
生徒
「分や秒も変更したい場合は、withMinuteやwithSecondを組み合わせればいいんですね。」
先生
「その通りです。with系メソッドを組み合わせると、日時の一部分だけを柔軟に操作できます。」
生徒
「勤怠管理や予約システムでも、基準時刻を作るときに使えそうです。」
先生
「よく理解できています。withHourを覚えると、Javaの日時操作をより実務的に扱えるようになります。」