Complete Java JulianFields class tutorial covering all methods with examples. Learn about Julian date handling in Java.
Last modified: April 16, 2025
The java.time.temporal.JulianFields class provides fields for Julian date calculations. It defines constants representing Julian day numbers. These fields can be used with temporal objects like LocalDate and Instant.
JulianFields implements the TemporalField interface. It supports Julian day number calculations according to astronomical conventions. The class is part of Java’s modern date-time API introduced in Java 8.
JulianFields contains three static fields for different Julian date systems. These fields can be used to query and modify temporal objects. The class handles conversions between Julian and Gregorian calendar systems.
public final class JulianFields { public static final TemporalField JULIAN_DAY; public static final TemporalField MODIFIED_JULIAN_DAY; public static final TemporalField RATA_DIE; public static long getJulianDayNumber(int prolepticYear, int month, int day); public static LocalDate ofJulianDay(long julianDay); }
The code shows key components of JulianFields. The fields represent different Julian date systems. The utility methods convert between Julian days and calendar dates.
The JULIAN_DAY field represents the Julian day number system. Day 0 is January 1, 4713 BC in the Julian calendar. This field is useful for astronomical calculations.
Main.java
package com.zetcode;
import java.time.LocalDate; import java.time.temporal.JulianFields;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2025, 4, 16);
// Get Julian day number
long julianDay = date.getLong(JulianFields.JULIAN_DAY);
System.out.println("Julian day number: " + julianDay);
// Create date from Julian day
LocalDate fromJulian = LocalDate.now()
.with(JulianFields.JULIAN_DAY, 2460423);
System.out.println("From Julian day: " + fromJulian);
}
}
This example demonstrates using the JULIAN_DAY field. It shows conversion between LocalDate and Julian day numbers. The output represents the same date in different systems.
MODIFIED_JULIAN_DAY is a variant that starts from November 17, 1858. It’s commonly used in scientific applications. The zero point is MJD 2400000.5.
Main.java
package com.zetcode;
import java.time.LocalDate; import java.time.temporal.JulianFields;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2025, 4, 16);
// Get Modified Julian day
long mjd = date.getLong(JulianFields.MODIFIED_JULIAN_DAY);
System.out.println("Modified Julian day: " + mjd);
// Create date from MJD
LocalDate fromMjd = LocalDate.now()
.with(JulianFields.MODIFIED_JULIAN_DAY, 60432);
System.out.println("From MJD: " + fromMjd);
}
}
This example shows usage of MODIFIED_JULIAN_DAY. The MJD system simplifies calculations by using smaller numbers. It’s widely used in astronomy and space science.
RATA_DIE represents days since January 1, 1 AD in the proleptic Gregorian calendar. It’s useful for chronological calculations spanning long periods.
Main.java
package com.zetcode;
import java.time.LocalDate; import java.time.temporal.JulianFields;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2025, 4, 16);
// Get Rata Die day
long rataDie = date.getLong(JulianFields.RATA_DIE);
System.out.println("Rata Die: " + rataDie);
// Create date from Rata Die
LocalDate fromRd = LocalDate.now()
.with(JulianFields.RATA_DIE, 738976);
System.out.println("From Rata Die: " + fromRd);
}
}
This example demonstrates the RATA_DIE field. The system counts days continuously from 1 AD. It’s useful for historical date calculations.
JulianFields provides methods for direct conversion between Julian days and Gregorian dates. These are useful when working with legacy systems.
Main.java
package com.zetcode;
import java.time.LocalDate; import java.time.temporal.JulianFields;
public class Main {
public static void main(String[] args) {
// Convert Gregorian to Julian day
long jd = JulianFields.getJulianDayNumber(2025, 4, 16);
System.out.println("Julian day number: " + jd);
// Convert Julian day to Gregorian
LocalDate date = JulianFields.ofJulianDay(2460423);
System.out.println("Gregorian date: " + date);
}
}
This example shows direct conversion methods. The getJulianDayNumber method takes year, month, day parameters. The ofJulianDay method creates LocalDate from Julian day.
JulianFields can be used with Instant to represent moments in time. This combines Julian dates with precise time-of-day information.
Main.java
package com.zetcode;
import java.time.Instant; import java.time.ZoneId; import java.time.temporal.JulianFields;
public class Main {
public static void main(String[] args) {
Instant now = Instant.now();
// Get Julian day from Instant
long julianDay = now.atZone(ZoneId.systemDefault())
.getLong(JulianFields.JULIAN_DAY);
System.out.println("Current Julian day: " + julianDay);
// Create Instant from Julian day
Instant fromJd = Instant.EPOCH
.plus(2460423, JulianFields.JULIAN_DAY.getBaseUnit());
System.out.println("Instant from JD: " + fromJd);
}
}
This example demonstrates using JulianFields with Instant. The conversion requires timezone context for accurate date determination. The example shows bidirectional conversion.
Julian day numbers simplify date difference calculations. They provide a continuous count of days without calendar complications.
Main.java
package com.zetcode;
import java.time.LocalDate; import java.time.temporal.JulianFields;
public class Main {
public static void main(String[] args) {
LocalDate date1 = LocalDate.of(2025, 1, 1);
LocalDate date2 = LocalDate.of(2025, 4, 16);
// Calculate days between dates using Julian days
long jd1 = date1.getLong(JulianFields.JULIAN_DAY);
long jd2 = date2.getLong(JulianFields.JULIAN_DAY);
long daysBetween = jd2 - jd1;
System.out.println("Days between dates: " + daysBetween);
}
}
This example shows how Julian day numbers simplify date arithmetic. The calculation handles month lengths and leap years automatically. The result is a simple day count.
JulianFields enables accurate calculations with historical dates. This is useful for applications dealing with ancient events or long-term timelines.
Main.java
package com.zetcode;
import java.time.LocalDate; import java.time.temporal.JulianFields;
public class Main {
public static void main(String[] args) {
// Historical event (Julius Caesar's death)
LocalDate idesOfMarch = LocalDate.of(-44, 3, 15);
// Get Julian day for historical date
long jd = idesOfMarch.getLong(JulianFields.JULIAN_DAY);
System.out.println("Julius Caesar's death (JD): " + jd);
// Calculate days since historical event
long currentJd = LocalDate.now().getLong(JulianFields.JULIAN_DAY);
long daysSince = currentJd - jd;
System.out.println("Days since event: " + daysSince);
}
}
This example demonstrates historical date calculations. Julian day numbers handle BC dates correctly. The calculation shows days elapsed since a famous historical event.
Java JulianFields Class Documentation
This tutorial covered the Java JulianFields class and its usage for various date calculations. Julian day numbers provide a powerful tool for temporal calculations across different calendar systems.
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.