LocalDateTime で時刻も扱う
予約の日は分かるのに、何時からかが分からない
LocalDate が持っているのは年月日だけです。誕生日や記念日ならそれで足りますが、「1 月 20 日 9 時 5 分から会議室 A」のような予定を保存しようとした瞬間に手詰まりになります。時刻を別の int 変数で持ち回る手もありますが、日付だけ更新して時刻を直し忘れる、という事故が必ず起きます。
日付と時刻をひとつの値にまとめた型が java.time.LocalDateTime です。作り方は LocalDate と同じで、static メソッドの of に渡す引数が後ろに 2 つ増えるだけです。
Java
import java.time.LocalDateTime;
public class Demo {
public static void main(String[] args) {
LocalDateTime meeting = LocalDateTime.of(2026, 1, 20, 9, 5);
System.out.println(meeting); // 2026-01-20T09:05
System.out.println(meeting.getHour()); // 9
System.out.println(meeting.getMinute()); // 5
}
}時は 0 から 23 の 24 時間制、分は 0 から 59 です。秒まで指定したいときは of(年, 月, 日, 時, 分, 秒) という 6 引数の形もあります。
表示すると、真ん中に T が挟まる
そのまま出力すると 2026-01-20T09:05 になります。機械同士でやり取りする分には便利な形ですが、画面に出すには無骨です。並びを自分で決めたいときは DateTimeFormatter を使い、ofPattern に並べた記号が実際の値に置き換わります。
Java
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
LocalDateTime meeting = LocalDateTime.of(2026, 1, 20, 14, 5);
DateTimeFormatter f = DateTimeFormatter.ofPattern("MM/dd HH:mm");
System.out.println(meeting.format(f)); // 01/20 14:05ここで使った記号は 4 つだけです。MM が月、dd が日、HH が時、mm が分を表します。
hh と書くと、14 時が 02 になる
この記号は大文字と小文字が別物です。しかも取り違えても文法としては正しいので、コンパイルは通ってしまいます。実際によく踏むのは次の 2 つです。
MMは月、mmは分。日付側にmmと書くと、01/20のはずが05/20のような値になりますHHは 24 時間制、hhは 12 時間制。hhにすると 14 時が02と表示され、午前か午後か分からない文字列ができあがります
Java
DateTimeFormatter wrong = DateTimeFormatter.ofPattern("MM/dd hh:mm");
System.out.println(meeting.format(wrong)); // 01/20 02:05どちらも例外は出ません。出来上がった文字列を目で見るまで気づけない種類のバグなので、パターンを書いたら必ず 1 回は出力を確かめてください。
やってみよう
Solution.formatDateTime(int year, int month, int day, int hour, int minute) を完成させます。
import java.time.LocalDateTime;とimport java.time.format.DateTimeFormatter;を書く- 受け取った 5 つの数値から
LocalDateTimeを作る - 年・月・日をハイフンでつなぎ、半角スペースを挟んで、時と分をコロンでつないだ並びのパターンを組み立てて書式化し、
returnする
formatDateTime(2024, 1, 1, 0, 0) は "2024-01-01 00:00" を返します。年は 4 桁、それ以外は 2 桁固定なので、ゼロ埋めは DateTimeFormatter が自動でやってくれます。
要件
- ファイル先頭で
import java.time.LocalDateTime;とimport java.time.format.DateTimeFormatter;を書くこと LocalDateTime.of(year, month, day, hour, minute)で日時オブジェクトを生成すること (SimpleDateFormatなどの旧 API は使わない)DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")を使って書式化し、その結果をreturnすること
入出力例
formatDateTime(2026, 5, 19, 14, 30) → "2026-05-19 14:30"
formatDateTime(2024, 1, 1, 0, 0) → "2024-01-01 00:00"
formatDateTime(2025, 12, 31, 23, 59) → "2025-12-31 23:59"
formatDateTime(2024, 2, 29, 12, 0) → "2024-02-29 12:00"