Java Tips | 日付・時間:LocalTime生成

Java Java
スポンサーリンク

LocalTime は「時刻だけ」を扱うクラス

LocalTime は、「時・分・秒だけ」を扱うクラスです。
日付(年月日)もタイムゾーンも持ちません。

「営業開始時刻(09:00)」「締切時刻(17:30)」「アラーム時刻(07:00)」のように、
“何日の何時”ではなく“何時何分”だけ分かればいい場面で使います。

java.time パッケージ(Java 8 以降)の一員で、
古い DateCalendar よりも直感的に扱えます。


現在時刻を生成する:LocalTime.now()

「今この瞬間の“時刻”」が欲しいとき

一番基本は LocalTime.now() です。

import java.time.LocalTime;

public class NowExample {

    public static void main(String[] args) {
        LocalTime now = LocalTime.now();
        System.out.println(now); // 例: 21:57:12.345678900
    }
}
Java

ここでのポイントは、「“今”の“時刻部分だけ”を切り出している」ということです。
日付は含まれません。

業務での典型的な使い方としては、例えばこうです。

特定のバッチを「業務時間内だけ動かしたい」ので、
LocalTime.now() が 09:00〜18:00 の間かどうかを判定する。
「今が締切時刻を過ぎているか」をチェックする。

「とりあえず今の時刻が欲しい」と思ったら、まず LocalTime.now() を思い出してください。


時・分・秒を指定して生成する:LocalTime.of(…)

「固定の時刻」をコードでハッキリ書きたいとき

「毎日 09:00 に処理開始」「締切は 17:30」など、
意味のある時刻をコードに埋め込みたいときは LocalTime.of を使います。

import java.time.LocalTime;

public class OfExample {

    public static void main(String[] args) {
        LocalTime start = LocalTime.of(9, 0);          // 09:00
        LocalTime end   = LocalTime.of(17, 30);        // 17:30
        LocalTime full  = LocalTime.of(23, 59, 59);    // 23:59:59

        System.out.println(start);
        System.out.println(end);
        System.out.println(full);
    }
}
Java

重要なポイントは二つです。

一つ目は、「時・分・秒は“人間の感覚どおり”に指定する」ということです。
LocalTime.of(9, 0) は素直に「9時0分」です。
Calendar のような「月が0始まり」みたいな罠はありません。

二つ目は、「存在しない時刻を指定すると例外になる」ということです。

LocalTime bad = LocalTime.of(25, 0);   // DateTimeException
LocalTime bad2 = LocalTime.of(23, 60); // DateTimeException
Java

これにより、「ありえない時刻」が紛れ込むのを早い段階で防げます。
「業務開始時刻」「締切時刻」「休憩開始時刻」など、
ビジネス上意味のある時刻を定数として持つときにとても便利です。


文字列から生成する:LocalTime.parse(文字列)

「HH:mm」や「HH:mm:ss」の文字列を LocalTime に変換する

設定ファイルや DB、CSV などから、
「09:30」「17:45:00」といった文字列で時刻を受け取ることはよくあります。

一番基本は、ISO形式(HH:mm または HH:mm:ss)の文字列を parse する方法です。

import java.time.LocalTime;

public class ParseExample {

    public static void main(String[] args) {
        LocalTime t1 = LocalTime.parse("09:30");
        LocalTime t2 = LocalTime.parse("17:45:00");

        System.out.println(t1); // 09:30
        System.out.println(t2); // 17:45
    }
}
Java

デフォルトでは、"HH:mm" または "HH:mm:ss" のような形式を解釈してくれます。

もし "9時30分" のような独自形式を扱いたい場合は、
DateTimeFormatter を使います。

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

public class ParseWithFormatterExample {

    public static void main(String[] args) {
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("HH時mm分");
        LocalTime time = LocalTime.parse("09時30分", fmt);
        System.out.println(time); // 09:30
    }
}
Java

業務では、
「設定ファイルに“業務開始時刻=09:00”と書いておき、起動時に LocalTime に変換する」
「CSV の時刻列を LocalTime に変換してバリデーションする」
といった場面でよく使います。


LocalTime 生成と「業務時間」の判定

「この時刻が業務時間内か?」を LocalTime で書く

LocalTime を使うと、「時間帯の判定」がとても素直に書けます。

例えば、「業務時間は 09:00〜18:00」とします。

import java.time.LocalTime;

public class BusinessHourExample {

    private static final LocalTime START = LocalTime.of(9, 0);
    private static final LocalTime END   = LocalTime.of(18, 0);

    public static boolean isInBusinessHours(LocalTime time) {
        return !time.isBefore(START) && !time.isAfter(END);
    }

    public static void main(String[] args) {
        System.out.println(isInBusinessHours(LocalTime.of(8, 59)));  // false
        System.out.println(isInBusinessHours(LocalTime.of(9, 0)));   // true
        System.out.println(isInBusinessHours(LocalTime.of(12, 0)));  // true
        System.out.println(isInBusinessHours(LocalTime.of(18, 0)));  // true
        System.out.println(isInBusinessHours(LocalTime.of(18, 1)));  // false
    }
}
Java

ここでの重要ポイントは三つです。

一つ目は、「業務時間の開始・終了を LocalTime の定数として表現している」こと。
LocalTime.of(9, 0) のように、意味のある時刻をコードに埋め込めます。

二つ目は、「isBefore / isAfter を使って、時刻の大小比較を直感的に書ける」こと。
!time.isBefore(START) は「開始時刻以上」、
!time.isAfter(END) は「終了時刻以下」を意味します。

三つ目は、「日付を意識せず、“時間帯”だけで判定している」こと。
「毎日同じ時間帯で動くルール」を書くときに、LocalTime はとても相性が良いです。


LocalTime とタイムゾーンの関係

「LocalTime 自体はタイムゾーンを持たない」が、生成元は持っている

LocalTime はタイムゾーンを持ちません。
「21:57:00」という“時刻”だけです。

ただし、LocalTime.now() は内部で「どのタイムゾーンか」を見ています。
JVM のデフォルトタイムゾーンが日本なら、日本時間の“今の時刻”になります。

特定のタイムゾーンの現在時刻が欲しい場合は、
ZoneId を渡します。

import java.time.LocalTime;
import java.time.ZoneId;

public class ZonedNowExample {

    public static void main(String[] args) {
        ZoneId tokyo = ZoneId.of("Asia/Tokyo");
        ZoneId utc   = ZoneId.of("UTC");

        LocalTime tokyoNow = LocalTime.now(tokyo);
        LocalTime utcNow   = LocalTime.now(utc);

        System.out.println("Tokyo: " + tokyoNow);
        System.out.println("UTC  : " + utcNow);
    }
}
Java

業務では、
「システムは UTC で動いているが、ビジネスロジックは日本時間で考える」
といったケースがよくあります。

そのときは、
「どのタイムゾーン基準の LocalTime なのか」を意識して生成することが大事です。


まとめ:LocalTime生成で身につけてほしい感覚

LocalTime は、
「時刻だけを安全に扱うための、今どきの標準ツール」です。

今の時刻が欲しいなら LocalTime.now()
固定の時刻を表現したいなら LocalTime.of(時, 分, [秒])
文字列から変換したいなら LocalTime.parse(必要なら DateTimeFormatter 付き)。
業務時間や締切時刻など、「時間帯のルール」を書くときにとても相性が良い。

あなたのコードのどこかに、
DateCalendar を使って「時刻だけ」を無理やり扱っている箇所があれば、
そこを一度「LocalTime 生成」に置き換えられないか眺めてみてください。

その小さな置き換えが、
「日付と時刻をきちんと分けて設計できるエンジニア」への、
いい一歩になります。

タイトルとURLをコピーしました