Java ChronoField Enum
Last modified: April 16, 2025
The java.time.temporal.ChronoField
enum implements TemporalField
and represents standard fields for date and time. It provides units like year,
month, day, hour, minute, and second. Each field has a range of valid values.
ChronoField
is used with temporal objects like LocalDate
,
LocalTime
, and ZonedDateTime
. It enables access to
specific components of date-time objects. The enum contains both date and time
related fields.
ChronoField Enum Overview
ChronoField
provides constants for all standard date-time fields.
Each field has methods to get its range and base unit. The enum implements
TemporalField
interface for temporal access and adjustment.
public enum ChronoField implements TemporalField { NANO_OF_SECOND, NANO_OF_DAY, MICRO_OF_SECOND, MICRO_OF_DAY, MILLI_OF_SECOND, MILLI_OF_DAY, SECOND_OF_MINUTE, SECOND_OF_DAY, MINUTE_OF_HOUR, MINUTE_OF_DAY, HOUR_OF_AMPM, HOUR_OF_DAY, AMPM_OF_DAY, DAY_OF_WEEK, DAY_OF_MONTH, DAY_OF_YEAR, EPOCH_DAY, ALIGNED_WEEK_OF_MONTH, ALIGNED_WEEK_OF_YEAR, ALIGNED_DAY_OF_WEEK_IN_MONTH, ALIGNED_DAY_OF_WEEK_IN_YEAR, MONTH_OF_YEAR, PROLEPTIC_MONTH, YEAR_OF_ERA, YEAR, ERA, INSTANT_SECONDS, OFFSET_SECONDS; // Methods public ValueRange range(); public boolean isDateBased(); public boolean isTimeBased(); public TemporalUnit getBaseUnit(); public TemporalUnit getRangeUnit(); }
The code above shows the enum constants and key methods. Fields are categorized
as date-based or time-based. Each field has a defined range of valid values
accessible via range()
method.
Accessing Date Components
ChronoField
can extract date components like year, month, and day.
Date-based fields work with temporal objects that contain date information.
The example shows common date field operations.
package com.zetcode; import java.time.LocalDate; import java.time.temporal.ChronoField; public class Main { public static void main(String[] args) { LocalDate date = LocalDate.of(2025, 4, 15); // Get year int year = date.get(ChronoField.YEAR); System.out.println("Year: " + year); // Get month int month = date.get(ChronoField.MONTH_OF_YEAR); System.out.println("Month: " + month); // Get day of month int day = date.get(ChronoField.DAY_OF_MONTH); System.out.println("Day: " + day); // Get day of year int dayOfYear = date.get(ChronoField.DAY_OF_YEAR); System.out.println("Day of year: " + dayOfYear); // Check if field is supported boolean supported = date.isSupported(ChronoField.ERA); System.out.println("ERA supported: " + supported); } }
This example demonstrates accessing date components using ChronoField
.
The get()
method retrieves field values from temporal objects.
isSupported()
checks if a field is available for the temporal type.
Accessing Time Components
Time-based fields provide access to hour, minute, second, and nanosecond values. These fields work with temporal objects containing time information. The example shows common time field operations.
package com.zetcode; import java.time.LocalTime; import java.time.temporal.ChronoField; public class Main { public static void main(String[] args) { LocalTime time = LocalTime.of(14, 30, 45, 500_000); // Get hour int hour = time.get(ChronoField.HOUR_OF_DAY); System.out.println("Hour: " + hour); // Get minute int minute = time.get(ChronoField.MINUTE_OF_HOUR); System.out.println("Minute: " + minute); // Get second int second = time.get(ChronoField.SECOND_OF_MINUTE); System.out.println("Second: " + second); // Get nano int nano = time.get(ChronoField.NANO_OF_SECOND); System.out.println("Nanosecond: " + nano); // Check AM/PM int ampm = time.get(ChronoField.AMPM_OF_DAY); System.out.println("AMPM: " + (ampm == 0 ? "AM" : "PM")); } }
This example shows how to access time components using ChronoField
.
The HOUR_OF_DAY
provides 24-hour format while AMPM_OF_DAY
distinguishes between morning and afternoon. All time fields have defined ranges.
Working with Date-Time Objects
ChronoField
works with complete date-time objects like
LocalDateTime
and ZonedDateTime
. Both date and time
fields can be accessed from these objects.
package com.zetcode; import java.time.LocalDateTime; import java.time.ZonedDateTime; import java.time.temporal.ChronoField; public class Main { public static void main(String[] args) { LocalDateTime ldt = LocalDateTime.now(); System.out.println("Current date-time: " + ldt); // Get combined fields int year = ldt.get(ChronoField.YEAR); int hour = ldt.get(ChronoField.HOUR_OF_DAY); System.out.printf("Year: %d, Hour: %d%n", year, hour); ZonedDateTime zdt = ZonedDateTime.now(); System.out.println("Zoned date-time: " + zdt); // Get day of week (1-7) int dow = zdt.get(ChronoField.DAY_OF_WEEK); System.out.println("Day of week: " + dow); // Get epoch day long epochDay = zdt.getLong(ChronoField.EPOCH_DAY); System.out.println("Epoch day: " + epochDay); } }
This example demonstrates using ChronoField
with date-time objects.
Both date and time fields are accessible from the same object. Some fields like
EPOCH_DAY
return long values instead of integers.
Field Validation and Ranges
Each ChronoField
has defined valid value ranges. These ranges can
be checked before accessing fields. The range()
method provides
minimum and maximum values.
package com.zetcode; import java.time.LocalDate; import java.time.temporal.ChronoField; import java.time.temporal.ValueRange; public class Main { public static void main(String[] args) { // Get range for day of month ValueRange dayRange = ChronoField.DAY_OF_MONTH.range(); System.out.println("Day of month range: " + dayRange); // Get range for month ValueRange monthRange = ChronoField.MONTH_OF_YEAR.range(); System.out.println("Month range: " + monthRange); // Check if value is valid LocalDate date = LocalDate.of(2025, 2, 1); boolean valid = date.isSupported(ChronoField.DAY_OF_MONTH) && date.range(ChronoField.DAY_OF_MONTH).isValidValue(30); System.out.println("Is 30 valid for February: " + valid); // Check hour range ValueRange hourRange = ChronoField.HOUR_OF_DAY.range(); System.out.println("Hour range: " + hourRange); } }
This example shows how to work with field ranges and validation. The
range()
method returns minimum and maximum valid values.
isValidValue()
checks if a specific value is valid for the field.
Adjusting Temporal Objects
ChronoField
can be used to adjust temporal objects. The
with()
method creates a new object with the modified field.
This is useful for date-time manipulation.
package com.zetcode; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.temporal.ChronoField; public class Main { public static void main(String[] args) { LocalDate date = LocalDate.of(2025, 4, 15); System.out.println("Original date: " + date); // Change year LocalDate newYear = date.with(ChronoField.YEAR, 2026); System.out.println("New year: " + newYear); // Change month LocalDate newMonth = date.with(ChronoField.MONTH_OF_YEAR, 12); System.out.println("New month: " + newMonth); LocalDateTime dateTime = LocalDateTime.now(); System.out.println("Original date-time: " + dateTime); // Change hour LocalDateTime newHour = dateTime.with(ChronoField.HOUR_OF_DAY, 23); System.out.println("New hour: " + newHour); // Change minute LocalDateTime newMinute = dateTime.with(ChronoField.MINUTE_OF_HOUR, 0); System.out.println("New minute: " + newMinute); } }
This example demonstrates adjusting temporal objects using ChronoField
.
The with()
method returns a new object with the specified field
changed. Original objects remain immutable as per Java Time API design.
Special Fields and Conversions
ChronoField
includes special fields like EPOCH_DAY
and
INSTANT_SECONDS
for conversions. These fields enable working with
different time representations.
package com.zetcode; import java.time.Instant; import java.time.LocalDate; import java.time.ZonedDateTime; import java.time.temporal.ChronoField; public class Main { public static void main(String[] args) { // EPOCH_DAY example LocalDate date = LocalDate.of(2025, 1, 1); long epochDay = date.getLong(ChronoField.EPOCH_DAY); System.out.println("Epoch day: " + epochDay); // Convert back from epoch day LocalDate fromEpoch = LocalDate.ofEpochDay(epochDay); System.out.println("From epoch day: " + fromEpoch); // INSTANT_SECONDS example ZonedDateTime zdt = ZonedDateTime.now(); long instantSeconds = zdt.getLong(ChronoField.INSTANT_SECONDS); System.out.println("Instant seconds: " + instantSeconds); // Convert back from instant seconds Instant instant = Instant.ofEpochSecond(instantSeconds); System.out.println("From instant seconds: " + instant); } }
This example shows special fields for time conversions. EPOCH_DAY
represents days since 1970-01-01, while INSTANT_SECONDS
represents
seconds since the same epoch. These fields enable interoperability between
different time representations.
Source
Java ChronoField Enum Documentation
In this article, we've covered the essential fields and features of the Java ChronoField enum. Understanding these concepts is crucial for working with date and time components in Java applications.
Author
List all Java tutorials.