Complete Java ChronoLocalDateTime interface tutorial covering all methods with examples. Learn about chronological date-time handling in Java.
Last modified: April 16, 2025
The java.time.chrono.ChronoLocalDateTime interface represents a date-time without a time-zone in an arbitrary chronology. It is the base interface for date-time objects in different calendar systems.
ChronoLocalDateTime combines date and time components while being independent of time zones. It supports various calendar systems beyond ISO-8601. The interface is immutable and thread-safe.
ChronoLocalDateTime provides methods for date-time manipulation, comparison, and formatting. It works with Chronology to support different calendar systems. The interface extends Temporal and Comparable.
public interface ChronoLocalDateTime<D extends ChronoLocalDate> extends Temporal, TemporalAdjuster, Comparable<ChronoLocalDateTime<?>> {
Chronology getChronology();
D toLocalDate();
LocalTime toLocalTime();
boolean isAfter(ChronoLocalDateTime<?> other);
boolean isBefore(ChronoLocalDateTime<?> other);
boolean isEqual(ChronoLocalDateTime<?> other);
String format(DateTimeFormatter formatter);
ChronoZonedDateTime<D> atZone(ZoneId zone);
}
The code shows key methods of ChronoLocalDateTime. These methods allow working with date-time values across different calendar systems. The interface provides precision up to nanoseconds.
ChronoLocalDateTime objects are typically created through implementations like JapaneseDate or HijrahDate. The ISO calendar system uses LocalDateTime.
Main.java
package com.zetcode;
import java.time.LocalDateTime; import java.time.chrono.HijrahDate; import java.time.chrono.JapaneseDate; import java.time.chrono.MinguoDate; import java.time.chrono.ThaiBuddhistDate;
public class Main {
public static void main(String[] args) {
// ISO calendar system
LocalDateTime isoDateTime = LocalDateTime.now();
System.out.println("ISO DateTime: " + isoDateTime);
// Japanese calendar system
JapaneseDate japaneseDate = JapaneseDate.now();
LocalDateTime japaneseTime = LocalDateTime.now();
ChronoLocalDateTime<JapaneseDate> japaneseDateTime =
JapaneseDate.from(japaneseDate).atTime(japaneseTime.toLocalTime());
System.out.println("Japanese DateTime: " + japaneseDateTime);
// Hijrah calendar system
HijrahDate hijrahDate = HijrahDate.now();
ChronoLocalDateTime<HijrahDate> hijrahDateTime =
hijrahDate.atTime(LocalDateTime.now().toLocalTime());
System.out.println("Hijrah DateTime: " + hijrahDateTime);
}
}
This example demonstrates creating ChronoLocalDateTime objects in different calendar systems. Each system combines its specific date with a standard local time. The output shows date-time values in their respective calendars.
ChronoLocalDateTime supports comparison operations across different calendar systems. The comparisons are based on the same instant on the time-line.
Main.java
package com.zetcode;
import java.time.LocalDateTime; import java.time.chrono.ChronoLocalDateTime; import java.time.chrono.JapaneseDate;
public class Main {
public static void main(String[] args) {
LocalDateTime isoDateTime = LocalDateTime.now();
ChronoLocalDateTime<JapaneseDate> japaneseDateTime =
JapaneseDate.now().atTime(LocalDateTime.now().toLocalTime());
System.out.println("ISO DateTime: " + isoDateTime);
System.out.println("Japanese DateTime: " + japaneseDateTime);
// Comparison
System.out.println("Is ISO after Japanese: " +
isoDateTime.isAfter(japaneseDateTime));
System.out.println("Is ISO before Japanese: " +
isoDateTime.isBefore(japaneseDateTime));
System.out.println("Is ISO equal to Japanese: " +
isoDateTime.isEqual(japaneseDateTime));
}
}
This example compares date-time values from different calendar systems. The comparison methods convert both values to the same instant before comparing. Note that isEqual checks for the same instant, not same display.
ChronoLocalDateTime can be formatted using DateTimeFormatter. The formatter respects the chronology of the date-time value being formatted.
Main.java
package com.zetcode;
import java.time.LocalDateTime; import java.time.chrono.JapaneseDate; import java.time.chrono.ChronoLocalDateTime; import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
ChronoLocalDateTime<JapaneseDate> japaneseDateTime =
JapaneseDate.now().atTime(LocalDateTime.now().toLocalTime());
// Default formatting
System.out.println("Default format: " + japaneseDateTime);
// Custom formatting
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("GGGG yyyy-MM-dd HH:mm:ss");
String formatted = japaneseDateTime.format(formatter);
System.out.println("Custom format: " + formatted);
// ISO formatting
DateTimeFormatter isoFormatter = DateTimeFormatter.ISO_DATE_TIME;
System.out.println("ISO format: " + japaneseDateTime.format(isoFormatter));
}
}
This example shows different ways to format ChronoLocalDateTime. The formatter includes era information for non-ISO calendars. Custom patterns can display calendar-specific fields like Japanese era names.
ChronoLocalDateTime can be converted to ChronoZonedDateTime by adding time zone information. This conversion is essential for time zone aware operations.
Main.java
package com.zetcode;
import java.time.LocalDateTime; import java.time.ZoneId; import java.time.chrono.JapaneseDate; import java.time.chrono.ChronoLocalDateTime; import java.time.chrono.ChronoZonedDateTime;
public class Main {
public static void main(String[] args) {
ChronoLocalDateTime<JapaneseDate> japaneseDateTime =
JapaneseDate.now().atTime(LocalDateTime.now().toLocalTime());
// Convert to zoned date-time
ChronoZonedDateTime<JapaneseDate> zonedDateTime =
japaneseDateTime.atZone(ZoneId.of("Asia/Tokyo"));
System.out.println("Zoned Japanese DateTime: " + zonedDateTime);
// Convert to another time zone
ChronoZonedDateTime<JapaneseDate> newYorkTime =
zonedDateTime.withZoneSameInstant(ZoneId.of("America/New_York"));
System.out.println("Japanese DateTime in New York: " + newYorkTime);
}
}
This example demonstrates converting between ChronoLocalDateTime and ChronoZonedDateTime. The conversion preserves the chronology while adding time zone information. Time zone conversions adjust the time accordingly.
ChronoLocalDateTime supports temporal arithmetic through plus and minus methods. These operations respect the calendar system’s rules.
Main.java
package com.zetcode;
import java.time.LocalDateTime; import java.time.chrono.JapaneseDate; import java.time.chrono.ChronoLocalDateTime; import java.time.temporal.ChronoUnit;
public class Main {
public static void main(String[] args) {
ChronoLocalDateTime<JapaneseDate> japaneseDateTime =
JapaneseDate.now().atTime(LocalDateTime.now().toLocalTime());
System.out.println("Current: " + japaneseDateTime);
// Add days
ChronoLocalDateTime<JapaneseDate> nextWeek =
japaneseDateTime.plus(7, ChronoUnit.DAYS);
System.out.println("Next week: " + nextWeek);
// Subtract months
ChronoLocalDateTime<JapaneseDate> lastMonth =
japaneseDateTime.minus(1, ChronoUnit.MONTHS);
System.out.println("Last month: " + lastMonth);
// Add hours and minutes
ChronoLocalDateTime<JapaneseDate> later =
japaneseDateTime.plusHours(2).plusMinutes(30);
System.out.println("Later today: " + later);
}
}
This example shows date-time manipulation in the Japanese calendar system. The operations handle calendar-specific rules like month lengths. All methods return new objects as ChronoLocalDateTime is immutable.
ChronoLocalDateTime provides methods to access its date and time components separately. These components maintain their calendar system characteristics.
Main.java
package com.zetcode;
import java.time.LocalDateTime; import java.time.chrono.JapaneseDate; import java.time.chrono.ChronoLocalDateTime;
public class Main {
public static void main(String[] args) {
ChronoLocalDateTime<JapaneseDate> japaneseDateTime =
JapaneseDate.now().atTime(LocalDateTime.now().toLocalTime());
// Get date component
JapaneseDate date = japaneseDateTime.toLocalDate();
System.out.println("Date: " + date);
System.out.println("Era: " + date.getEra());
System.out.println("Year: " + date.getYear());
// Get time component
System.out.println("Time: " + japaneseDateTime.toLocalTime());
System.out.println("Hour: " + japaneseDateTime.getHour());
System.out.println("Minute: " + japaneseDateTime.getMinute());
}
}
This example demonstrates accessing components of a ChronoLocalDateTime. The date component provides calendar-specific fields like era. The time component is consistent across all calendar systems.
Java ChronoLocalDateTime Interface Documentation
In this article, we’ve covered the essential methods and features of the Java ChronoLocalDateTime interface. Understanding these concepts is crucial for working with multiple calendar systems in Java applications.
My name is Jan Bodnar, and I am a dedicated programmer with many years of experience in the field. I began writing programming articles in 2007 and have since authored over 1,400 articles and eight e-books. With more than eight years of teaching experience, I am committed to sharing my knowledge and helping others master programming concepts.
List all Java tutorials.