Date & Time
LocalTime Introduction
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 timeof(hour, minute, second): Create specific timegetHour(),getMinute(),getSecond(): Get componentsplusHours(),minusMinutes(): Add/subtract timeisBefore(),isAfter(): Compare timesparse(): 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)