When building scheduling applications, alarm systems, or tracking business hours, you need to work with time independently of dates. LocalTime handles clock time operations with nanosecond precision.

LocalTime represents a time without date in the ISO calendar system (hour-minute-second-nanosecond). It's part of the java.time package introduced in Java 8.

Getting Current Time

Current.java
// Current time

import java.time.LocalTime;

public class Current {

    public static void main(String[] args) {
        // Static replay uses a fixed sample "now".
        LocalTime now = LocalTime.of(14, 30, 45, 123456789);
        System.out.println("Sample now: " + now);

        // Time components
        int hour = now.getHour();
        int minute = now.getMinute();
        int second = now.getSecond();
        int nano = now.getNano();

        System.out.println("\nTime components:");
        System.out.println("Hour: " + hour);
        System.out.println("Minute: " + minute);
        System.out.println("Second: " + second);
        System.out.println("Nanosecond: " + nano);

        // Formatted output
        System.out.println("\nFormatted:");
        System.out.println(String.format("%02d:%02d:%02d", hour, minute, second));

        // 12-hour format
        int hour12 = hour % 12;
        if (hour12 == 0) hour12 = 12;
        String amPm = hour < 12 ? "AM" : "PM";
        System.out.println(String.format("%02d:%02d %s", hour12, minute, amPm));

        // Truncated times
        LocalTime toMinute = now.withSecond(0).withNano(0);
        System.out.println("\nTruncated to minute: " + toMinute);

        LocalTime toSecond = now.withNano(0);
        System.out.println("Truncated to second: " + toSecond);

        // Special times
        LocalTime midnight = LocalTime.MIDNIGHT;
        LocalTime noon = LocalTime.NOON;
        LocalTime min = LocalTime.MIN;
        LocalTime max = LocalTime.MAX;

        System.out.println("\nSpecial times:");
        System.out.println("Midnight: " + midnight);
        System.out.println("Noon: " + noon);
        System.out.println("Min: " + min);
        System.out.println("Max: " + max);

        // Seconds of day
        int secondOfDay = now.toSecondOfDay();
        System.out.println("\nSecond of day: " + secondOfDay);
        System.out.println("Total seconds in day: " + (24 * 60 * 60));
    }

}
LocalTime An immutable time object representing hour, minute, second, and nanosecond without date or timezone information.

Creating Specific Times

Create.java
// Create specific time

import java.time.LocalTime;

public class Create {

    public static void main(String[] args) {
        // Create with hour and minute
        LocalTime time1 = ;
        System.out.println("Time 1 (HH:MM): " + time1);

        // Create with hour, minute, second
        LocalTime time2 = LocalTime.of(14, 30, 45);
        System.out.println("Time 2 (HH:MM:SS): " + time2);

        // Create with hour, minute, second, nanosecond
        LocalTime time3 = LocalTime.of(14, 30, 45, 123456789);
        System.out.println("Time 3 (with nanos): " + time3);

        // Common times
        LocalTime morning = LocalTime.of(9, 0);
        LocalTime lunchTime = LocalTime.of(12, 30);
        LocalTime evening = LocalTime.of(18, 0);
        
        System.out.println("\nCommon times:");
        System.out.println("Morning: " + morning);
        System.out.println("Lunch: " + lunchTime);
        System.out.println("Evening: " + evening);

        // Midnight and noon
        LocalTime midnight = LocalTime.MIDNIGHT;  // 00:00
        LocalTime noon = LocalTime.NOON;          // 12:00
        
        System.out.println("\nSpecial:");
        System.out.println("Midnight: " + midnight);
        System.out.println("Noon: " + noon);

        // Modify components
        LocalTime modified = time1.withHour(16).withMinute(45);
        System.out.println("\nModified: " + modified);

        // Create from second of day
        int secondOfDay = 12 * 60 * 60 + 30 * 60;  // 12:30
        LocalTime fromSeconds = LocalTime.ofSecondOfDay(secondOfDay);
        System.out.println("From seconds (12:30): " + fromSeconds);

        // Create from nanosecond of day
        long nanoOfDay = 12L * 60 * 60 * 1_000_000_000 + 30L * 60 * 1_000_000_000;
        LocalTime fromNanos = LocalTime.ofNanoOfDay(nanoOfDay);
        System.out.println("From nanos (12:30): " + fromNanos);

        // Min and max
        LocalTime min = LocalTime.MIN;
        LocalTime max = LocalTime.MAX;
        System.out.println("\nMin: " + min);
        System.out.println("Max: " + max);

        // Generate hourly times
        System.out.println("\nHourly times:");
        for (int hour = 9; hour <= 17; hour++) {
            LocalTime t = LocalTime.of(hour, 0);
            System.out.println("  " + t);
        }
    }

}
// Create specific time

import java.time.LocalTime;

public class Create {

    public static void main(String[] args) {
        // Create with hour and minute
        LocalTime time1 = ;
        System.out.println("Time 1 (HH:MM): " + time1);

        // Create with hour, minute, second
        LocalTime time2 = LocalTime.of(14, 30, 45);
        System.out.println("Time 2 (HH:MM:SS): " + time2);

        // Create with hour, minute, second, nanosecond
        LocalTime time3 = LocalTime.of(14, 30, 45, 123456789);
        System.out.println("Time 3 (with nanos): " + time3);

        // Common times
        LocalTime morning = LocalTime.of(9, 0);
        LocalTime lunchTime = LocalTime.of(12, 30);
        LocalTime evening = LocalTime.of(18, 0);
        
        System.out.println("\nCommon times:");
        System.out.println("Morning: " + morning);
        System.out.println("Lunch: " + lunchTime);
        System.out.println("Evening: " + evening);

        // Midnight and noon
        LocalTime midnight = LocalTime.MIDNIGHT;  // 00:00
        LocalTime noon = LocalTime.NOON;          // 12:00
        
        System.out.println("\nSpecial:");
        System.out.println("Midnight: " + midnight);
        System.out.println("Noon: " + noon);

        // Modify components
        LocalTime modified = time1.withHour(16).withMinute(45);
        System.out.println("\nModified: " + modified);

        // Create from second of day
        int secondOfDay = 12 * 60 * 60 + 30 * 60;  // 12:30
        LocalTime fromSeconds = LocalTime.ofSecondOfDay(secondOfDay);
        System.out.println("From seconds (12:30): " + fromSeconds);

        // Create from nanosecond of day
        long nanoOfDay = 12L * 60 * 60 * 1_000_000_000 + 30L * 60 * 1_000_000_000;
        LocalTime fromNanos = LocalTime.ofNanoOfDay(nanoOfDay);
        System.out.println("From nanos (12:30): " + fromNanos);

        // Min and max
        LocalTime min = LocalTime.MIN;
        LocalTime max = LocalTime.MAX;
        System.out.println("\nMin: " + min);
        System.out.println("Max: " + max);

        // Generate hourly times
        System.out.println("\nHourly times:");
        for (int hour = 9; hour <= 17; hour++) {
            LocalTime t = LocalTime.of(hour, 0);
            System.out.println("  " + t);
        }
    }

}

Time Components

Components.java
// Time components

import java.time.LocalTime;

public class Components {

    public static void main(String[] args) {
        LocalTime time = ;
        
        System.out.println("Time: " + time);
        System.out.println();

        // Hour, minute, second
        System.out.println("Hour: " + time.getHour());
        System.out.println("Minute: " + time.getMinute());
        System.out.println("Second: " + time.getSecond());
        System.out.println("Nanosecond: " + time.getNano());

        // Convert to seconds of day
        int secondOfDay = time.toSecondOfDay();
        System.out.println("\nSecond of day: " + secondOfDay);

        // Convert to nanoseconds of day
        long nanoOfDay = time.toNanoOfDay();
        System.out.println("Nano of day: " + nanoOfDay);

        // Calculate milliseconds component
        int millis = time.getNano() / 1_000_000;
        System.out.println("\nMilliseconds: " + millis);

        // 12-hour format components
        int hour24 = time.getHour();
        int hour12 = hour24 % 12;
        if (hour12 == 0) hour12 = 12;
        String amPm = hour24 < 12 ? "AM" : "PM";
        
        System.out.println("\n12-hour format:");
        System.out.println("Hour (12): " + hour12);
        System.out.println("AM/PM: " + amPm);
        System.out.println("Time: " + String.format("%d:%02d %s", 
            hour12, time.getMinute(), amPm));

        // Truncate precision
        LocalTime toMinute = time.withSecond(0).withNano(0);
        LocalTime toSecond = time.withNano(0);
        
        System.out.println("\nTruncated:");
        System.out.println("Original: " + time);
        System.out.println("To minute: " + toMinute);
        System.out.println("To second: " + toSecond);

        // Check if before/after noon
        System.out.println("\nIs before noon: " + time.isBefore(LocalTime.NOON));
        System.out.println("Is after noon: " + time.isAfter(LocalTime.NOON));

        // Time periods
        System.out.println("\nTime period:");
        if (time.getHour() < 12) {
            System.out.println("Morning");
        } else if (time.getHour() < 17) {
            System.out.println("Afternoon");
        } else if (time.getHour() < 21) {
            System.out.println("Evening");
        } else {
            System.out.println("Night");
        }

        // Display various times
        System.out.println("\nVarious times of day:");
        LocalTime[] times = {
            LocalTime.of(6, 0),
            LocalTime.of(12, 0),
            LocalTime.of(18, 0),
            LocalTime.of(23, 59)
        };
        
        for (LocalTime t : times) {
            System.out.println(t + " - " + t.getHour() + "h " + 
                             t.getMinute() + "m");
        }
    }

}
// Time components

import java.time.LocalTime;

public class Components {

    public static void main(String[] args) {
        LocalTime time = ;
        
        System.out.println("Time: " + time);
        System.out.println();

        // Hour, minute, second
        System.out.println("Hour: " + time.getHour());
        System.out.println("Minute: " + time.getMinute());
        System.out.println("Second: " + time.getSecond());
        System.out.println("Nanosecond: " + time.getNano());

        // Convert to seconds of day
        int secondOfDay = time.toSecondOfDay();
        System.out.println("\nSecond of day: " + secondOfDay);

        // Convert to nanoseconds of day
        long nanoOfDay = time.toNanoOfDay();
        System.out.println("Nano of day: " + nanoOfDay);

        // Calculate milliseconds component
        int millis = time.getNano() / 1_000_000;
        System.out.println("\nMilliseconds: " + millis);

        // 12-hour format components
        int hour24 = time.getHour();
        int hour12 = hour24 % 12;
        if (hour12 == 0) hour12 = 12;
        String amPm = hour24 < 12 ? "AM" : "PM";
        
        System.out.println("\n12-hour format:");
        System.out.println("Hour (12): " + hour12);
        System.out.println("AM/PM: " + amPm);
        System.out.println("Time: " + String.format("%d:%02d %s", 
            hour12, time.getMinute(), amPm));

        // Truncate precision
        LocalTime toMinute = time.withSecond(0).withNano(0);
        LocalTime toSecond = time.withNano(0);
        
        System.out.println("\nTruncated:");
        System.out.println("Original: " + time);
        System.out.println("To minute: " + toMinute);
        System.out.println("To second: " + toSecond);

        // Check if before/after noon
        System.out.println("\nIs before noon: " + time.isBefore(LocalTime.NOON));
        System.out.println("Is after noon: " + time.isAfter(LocalTime.NOON));

        // Time periods
        System.out.println("\nTime period:");
        if (time.getHour() < 12) {
            System.out.println("Morning");
        } else if (time.getHour() < 17) {
            System.out.println("Afternoon");
        } else if (time.getHour() < 21) {
            System.out.println("Evening");
        } else {
            System.out.println("Night");
        }

        // Display various times
        System.out.println("\nVarious times of day:");
        LocalTime[] times = {
            LocalTime.of(6, 0),
            LocalTime.of(12, 0),
            LocalTime.of(18, 0),
            LocalTime.of(23, 59)
        };
        
        for (LocalTime t : times) {
            System.out.println(t + " - " + t.getHour() + "h " + 
                             t.getMinute() + "m");
        }
    }

}
time_components Individual parts of a time that can be extracted: hour (0-23), minute (0-59), second (0-59), nanosecond.

Comparing Times

Compare.java
// Compare times

import java.time.LocalTime;

public class Compare {

    public static void main(String[] args) {
        LocalTime time1 = LocalTime.of(9, 30);
        LocalTime time2 = LocalTime.of(14, 45);
        LocalTime time3 = LocalTime.of(9, 30);

        System.out.println("Time 1: " + time1);
        System.out.println("Time 2: " + time2);
        System.out.println("Time 3: " + time3);
        System.out.println();

        // isBefore, isAfter
        System.out.println("time1.isBefore(time2): " + time1.isBefore(time2));
        System.out.println("time1.isAfter(time2): " + time1.isAfter(time2));

        // equals
        System.out.println("\ntime1.equals(time2): " + time1.equals(time2));
        System.out.println("time1.equals(time3): " + time1.equals(time3));

        // compareTo
        System.out.println("\ntime1.compareTo(time2): " + time1.compareTo(time2));
        System.out.println("time2.compareTo(time1): " + time2.compareTo(time1));
        System.out.println("time1.compareTo(time3): " + time1.compareTo(time3));

        // Current time comparisons
        LocalTime now = LocalTime.of(13, 15);
        System.out.println("\nSample now: " + now);
        System.out.println("9:30 is before now: " + time1.isBefore(now));
        System.out.println("14:45 is after now: " + time2.isAfter(now));

        // Find earliest/latest
        LocalTime earliest = time1.isBefore(time2) ? time1 : time2;
        LocalTime latest = time1.isAfter(time2) ? time1 : time2;
        
        System.out.println("\nEarliest: " + earliest);
        System.out.println("Latest: " + latest);

        // Check if in time range
        LocalTime check = ;
        LocalTime start = LocalTime.of(9, 0);
        LocalTime end = LocalTime.of(17, 0);

        boolean inRange = !check.isBefore(start) && !check.isAfter(end);
        System.out.println("\n" + check + " in range [" + start + ", " + end + "]: " + inRange);

        // Sort times
        LocalTime[] times = {
            LocalTime.of(15, 30),
            LocalTime.of(9, 0),
            LocalTime.of(12, 15)
        };

        System.out.println("\nBefore sort:");
        for (LocalTime t : times) {
            System.out.println("  " + t);
        }

        java.util.Arrays.sort(times);

        System.out.println("After sort:");
        for (LocalTime t : times) {
            System.out.println("  " + t);
        }

        // Business hours check
        LocalTime businessStart = LocalTime.of(9, 0);
        LocalTime businessEnd = LocalTime.of(17, 0);
        
        System.out.println("\nBusiness hours check:");
        LocalTime[] testTimes = {
            LocalTime.of(8, 30),
            LocalTime.of(12, 0),
            LocalTime.of(18, 0)
        };
        
        for (LocalTime t : testTimes) {
            boolean isDuringBusiness = !t.isBefore(businessStart) && t.isBefore(businessEnd);
            System.out.println(t + " during business: " + isDuringBusiness);
        }

        // Midnight crossing
        LocalTime late = LocalTime.of(23, 0);
        LocalTime early = LocalTime.of(1, 0);
        System.out.println("\n23:00 is before 01:00: " + late.isBefore(early));
    }

}
// Compare times

import java.time.LocalTime;

public class Compare {

    public static void main(String[] args) {
        LocalTime time1 = LocalTime.of(9, 30);
        LocalTime time2 = LocalTime.of(14, 45);
        LocalTime time3 = LocalTime.of(9, 30);

        System.out.println("Time 1: " + time1);
        System.out.println("Time 2: " + time2);
        System.out.println("Time 3: " + time3);
        System.out.println();

        // isBefore, isAfter
        System.out.println("time1.isBefore(time2): " + time1.isBefore(time2));
        System.out.println("time1.isAfter(time2): " + time1.isAfter(time2));

        // equals
        System.out.println("\ntime1.equals(time2): " + time1.equals(time2));
        System.out.println("time1.equals(time3): " + time1.equals(time3));

        // compareTo
        System.out.println("\ntime1.compareTo(time2): " + time1.compareTo(time2));
        System.out.println("time2.compareTo(time1): " + time2.compareTo(time1));
        System.out.println("time1.compareTo(time3): " + time1.compareTo(time3));

        // Current time comparisons
        LocalTime now = LocalTime.of(13, 15);
        System.out.println("\nSample now: " + now);
        System.out.println("9:30 is before now: " + time1.isBefore(now));
        System.out.println("14:45 is after now: " + time2.isAfter(now));

        // Find earliest/latest
        LocalTime earliest = time1.isBefore(time2) ? time1 : time2;
        LocalTime latest = time1.isAfter(time2) ? time1 : time2;
        
        System.out.println("\nEarliest: " + earliest);
        System.out.println("Latest: " + latest);

        // Check if in time range
        LocalTime check = ;
        LocalTime start = LocalTime.of(9, 0);
        LocalTime end = LocalTime.of(17, 0);

        boolean inRange = !check.isBefore(start) && !check.isAfter(end);
        System.out.println("\n" + check + " in range [" + start + ", " + end + "]: " + inRange);

        // Sort times
        LocalTime[] times = {
            LocalTime.of(15, 30),
            LocalTime.of(9, 0),
            LocalTime.of(12, 15)
        };

        System.out.println("\nBefore sort:");
        for (LocalTime t : times) {
            System.out.println("  " + t);
        }

        java.util.Arrays.sort(times);

        System.out.println("After sort:");
        for (LocalTime t : times) {
            System.out.println("  " + t);
        }

        // Business hours check
        LocalTime businessStart = LocalTime.of(9, 0);
        LocalTime businessEnd = LocalTime.of(17, 0);
        
        System.out.println("\nBusiness hours check:");
        LocalTime[] testTimes = {
            LocalTime.of(8, 30),
            LocalTime.of(12, 0),
            LocalTime.of(18, 0)
        };
        
        for (LocalTime t : testTimes) {
            boolean isDuringBusiness = !t.isBefore(businessStart) && t.isBefore(businessEnd);
            System.out.println(t + " during business: " + isDuringBusiness);
        }

        // Midnight crossing
        LocalTime late = LocalTime.of(23, 0);
        LocalTime early = LocalTime.of(1, 0);
        System.out.println("\n23:00 is before 01:00: " + late.isBefore(early));
    }

}

Combining with Date

Combine.java
// Combine date and time

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;

public class Combine {

    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2025, 1, 29);
        LocalTime time = LocalTime.of(14, 30, 0);

        // Combine using atTime
        LocalDateTime dt1 = date.atTime(time);
        System.out.println("Date + Time: " + dt1);

        // Combine using atDate
        LocalDateTime dt2 = time.atDate(date);
        System.out.println("Time + Date: " + dt2);

        // Combine using LocalDateTime.of
        LocalDateTime dt3 = LocalDateTime.of(date, time);
        System.out.println("LocalDateTime.of: " + dt3);

        // Shorthand combinations
        LocalDateTime dt4 = date.atTime(14, 30);
        System.out.println("\nShorthand (HH:MM): " + dt4);

        LocalDateTime dt5 = date.atTime(14, 30, 45);
        System.out.println("Shorthand (HH:MM:SS): " + dt5);

        // Start and end of day
        LocalDateTime startOfDay = date.atStartOfDay();
        LocalDateTime endOfDay = date.atTime(LocalTime.MAX);
        
        System.out.println("\nStart of day: " + startOfDay);
        System.out.println("End of day: " + endOfDay);

        // Extract date and time from datetime
        LocalDateTime now = LocalDateTime.of(2025, 1, 29, 14, 30, 45);
        LocalDate extractedDate = now.toLocalDate();
        LocalTime extractedTime = now.toLocalTime();
        
        System.out.println("\nNow: " + now);
        System.out.println("Extracted date: " + extractedDate);
        System.out.println("Extracted time: " + extractedTime);

        // Common datetime patterns
        System.out.println("\nCommon datetimes:");
        
        // Today at specific time
        LocalDate today = LocalDate.of(2025, 1, 29);
        LocalDateTime todayAt9 = today.atTime(9, 0);
        System.out.println("Today at 9:00: " + todayAt9);
        
        // Tomorrow at noon
        LocalDateTime tomorrowNoon = today.plusDays(1).atTime(LocalTime.NOON);
        System.out.println("Tomorrow at noon: " + tomorrowNoon);
        
        // Next Monday at 9 AM
        int daysUntilMonday = (8 - today.getDayOfWeek().getValue()) % 7;
        if (daysUntilMonday == 0) daysUntilMonday = 7;
        LocalDateTime nextMonday9AM = today.plusDays(daysUntilMonday).atTime(9, 0);
        System.out.println("Next Monday 9 AM: " + nextMonday9AM);

        // Schedule times
        System.out.println("\nScheduled times for tomorrow:");
        LocalDate tomorrow = today.plusDays(1);
        LocalTime[] scheduleTimes = {
            LocalTime.of(9, 0),
            LocalTime.of(11, 30),
            LocalTime.of(14, 0),
            LocalTime.of(16, 30)
        };
        
        for (LocalTime t : scheduleTimes) {
            System.out.println("  " + tomorrow.atTime(t));
        }
    }

}
LocalDateTime Combines LocalDate and LocalTime into a single object representing both date and time.

Key Methods

  • now(): Current time
  • of(hour, minute, second): Create specific time
  • getHour(), getMinute(), getSecond(): Get components
  • plusHours(), minusMinutes(): Add/subtract time
  • isBefore(), isAfter(): Compare times
  • parse(): From string

Common Operations

  • Add/subtract hours, minutes, seconds
  • Compare times
  • Format to string
  • Combine with date to make LocalDateTime

Immutability

LocalTime is immutable - operations return new instances.

Exercise: Practical.java

Check if a given time falls within business hours (9:00 AM to 5:00 PM)