ZetCode

Java JulianFields Class

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 Class Overview

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.

Using JULIAN_DAY Field

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.

Using MODIFIED_JULIAN_DAY Field

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.

Using RATA_DIE Field

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.

Converting Between Julian and Gregorian

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.

Using JulianFields with Instant

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.

Calculating Date Differences

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.

Historical Date Calculations

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.

Source

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.

Author

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.