ZetCode

Java ThaiBuddhistDate Class

Last modified: April 16, 2025

The java.time.chrono.ThaiBuddhistDate class represents a date in the Thai Buddhist calendar system. This calendar is 543 years ahead of the Gregorian calendar. It's commonly used in Thailand.

ThaiBuddhistDate is immutable and thread-safe. It implements the ChronoLocalDate interface. The class provides methods to handle dates according to Thai Buddhist chronology.

ThaiBuddhistDate Class Overview

ThaiBuddhistDate provides methods to create, manipulate and format dates. Key operations include date arithmetic, field access, and conversion to other calendar systems. The class handles dates from year 1 onwards.

public final class ThaiBuddhistDate implements ChronoLocalDate, Serializable {
    public static ThaiBuddhistDate now();
    public static ThaiBuddhistDate now(ZoneId zone);
    public static ThaiBuddhistDate of(int prolepticYear, int month, int dayOfMonth);
    public static ThaiBuddhistDate from(TemporalAccessor temporal);
    public int getEraValue();
    public ThaiBuddhistEra getEra();
    public int lengthOfMonth();
    public ThaiBuddhistDate plus(long amountToAdd, TemporalUnit unit);
    public ThaiBuddhistDate minus(long amountToSubtract, TemporalUnit unit);
}

The code above shows key methods provided by ThaiBuddhistDate. These methods allow creating, manipulating and querying dates in the Thai Buddhist calendar system.

Creating ThaiBuddhistDate Objects

ThaiBuddhistDate objects can be created in several ways. The most common methods are now for current date and factory methods for specific dates. Conversion from other date types is also supported.

Main.java
package com.zetcode;

import java.time.chrono.ThaiBuddhistDate;
import java.time.LocalDate;
import java.time.ZoneId;

public class Main {

    public static void main(String[] args) {
        
        // Current date
        ThaiBuddhistDate now = ThaiBuddhistDate.now();
        System.out.println("Current Thai date: " + now);
        
        // Specific date
        ThaiBuddhistDate date1 = ThaiBuddhistDate.of(2565, 4, 15);
        System.out.println("Specific Thai date: " + date1);
        
        // From LocalDate
        ThaiBuddhistDate date2 = ThaiBuddhistDate.from(LocalDate.of(2022, 4, 15));
        System.out.println("Converted from LocalDate: " + date2);
        
        // With time zone
        ThaiBuddhistDate date3 = ThaiBuddhistDate.now(ZoneId.of("Asia/Bangkok"));
        System.out.println("Current date in Bangkok: " + date3);
    }
}

This example demonstrates different ways to create ThaiBuddhistDate objects. The output shows dates in Thai Buddhist chronology. Note the year difference compared to Gregorian dates.

Accessing Date Components

A ThaiBuddhistDate can be decomposed into its year, month, and day components. These values follow the Thai Buddhist calendar system. The era can also be accessed.

Main.java
package com.zetcode;

import java.time.chrono.ThaiBuddhistDate;
import java.time.temporal.ChronoField;

public class Main {

    public static void main(String[] args) {

        ThaiBuddhistDate date = ThaiBuddhistDate.now();
        
        // Get year (Buddhist era)
        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
        int day = date.get(ChronoField.DAY_OF_MONTH);
        System.out.println("Day: " + day);
        
        // Get era
        System.out.println("Era: " + date.getEra());
    }
}

This example shows how to extract components from a ThaiBuddhistDate. The year is 543 years ahead of the Gregorian calendar. The month and day values match the Gregorian calendar.

Date Arithmetic

ThaiBuddhistDate supports date arithmetic through plus and minus methods. These operations are useful for calculating future or past dates. The class handles month and year boundaries correctly.

Main.java
package com.zetcode;

import java.time.chrono.ThaiBuddhistDate;
import java.time.temporal.ChronoUnit;

public class Main {

    public static void main(String[] args) {

        ThaiBuddhistDate date = ThaiBuddhistDate.of(2565, 4, 15);
        
        // Add days
        ThaiBuddhistDate plusDays = date.plus(10, ChronoUnit.DAYS);
        System.out.println("10 days later: " + plusDays);
        
        // Subtract months
        ThaiBuddhistDate minusMonths = date.minus(2, ChronoUnit.MONTHS);
        System.out.println("2 months earlier: " + minusMonths);
        
        // Add years
        ThaiBuddhistDate plusYears = date.plus(1, ChronoUnit.YEARS);
        System.out.println("1 year later: " + plusYears);
        
        // Complex operation
        ThaiBuddhistDate complex = date.plus(3, ChronoUnit.MONTHS)
                                     .minus(15, ChronoUnit.DAYS);
        System.out.println("Complex operation result: " + complex);
    }
}

This example shows various ways to perform date arithmetic with ThaiBuddhistDate. Operations can use ChronoUnit constants for different time units. All calculations respect the Thai Buddhist calendar rules.

Comparing Dates

ThaiBuddhistDate objects can be compared to determine chronological order. The class provides isAfter, isBefore, and compareTo methods. These comparisons follow Thai Buddhist chronology.

Main.java
package com.zetcode;

import java.time.chrono.ThaiBuddhistDate;
import java.time.temporal.ChronoUnit;

public class Main {

    public static void main(String[] args) {

        ThaiBuddhistDate today = ThaiBuddhistDate.now();
        ThaiBuddhistDate tomorrow = today.plus(1, ChronoUnit.DAYS);
        ThaiBuddhistDate yesterday = today.minus(1, ChronoUnit.DAYS);
        
        System.out.println("Today is before tomorrow: " + today.isBefore(tomorrow));
        System.out.println("Today is after yesterday: " + today.isAfter(yesterday));
        System.out.println("Comparison result: " + today.compareTo(tomorrow));
        
        // Equality check
        ThaiBuddhistDate sameDate = ThaiBuddhistDate.of(
            today.get(ChronoField.YEAR),
            today.get(ChronoField.MONTH_OF_YEAR),
            today.get(ChronoField.DAY_OF_MONTH));
        System.out.println("Today equals sameDate: " + today.equals(sameDate));
    }
}

This example demonstrates various ways to compare ThaiBuddhistDate objects. The comparison methods consider the full date including year, month and day. Note that equality requires all components to match exactly.

Converting Between Calendar Systems

ThaiBuddhistDate can be converted to and from other calendar systems like Gregorian. These conversions are essential when working with multiple calendar systems in an application.

Main.java
package com.zetcode;

import java.time.LocalDate;
import java.time.chrono.ThaiBuddhistDate;
import java.time.format.DateTimeFormatter;

public class Main {

    public static void main(String[] args) {

        ThaiBuddhistDate thaiDate = ThaiBuddhistDate.now();
        
        // Convert to LocalDate (Gregorian)
        LocalDate gregorianDate = LocalDate.from(thaiDate);
        System.out.println("Gregorian date: " + gregorianDate);
        
        // Convert back to ThaiBuddhistDate
        ThaiBuddhistDate backToThai = ThaiBuddhistDate.from(gregorianDate);
        System.out.println("Back to Thai: " + backToThai);
        
        // Formatting
        DateTimeFormatter formatter = DateTimeFormatter
            .ofPattern("dd MMM yyyy GG");
        System.out.println("Formatted: " + formatter.format(thaiDate));
    }
}

This example demonstrates conversions between ThaiBuddhistDate and Gregorian dates. The formatter shows how to display dates with the Buddhist era marker. All conversions preserve the same day in different calendar systems.

Working with Date Fields

ThaiBuddhistDate provides methods to query various date fields. These include day-of-week, day-of-year, and month length. The values follow Thai Buddhist calendar rules.

Main.java
package com.zetcode;

import java.time.DayOfWeek;
import java.time.chrono.ThaiBuddhistDate;
import java.time.temporal.ChronoField;

public class Main {

    public static void main(String[] args) {

        ThaiBuddhistDate date = ThaiBuddhistDate.of(2565, 4, 15);
        
        // Day of week
        DayOfWeek dow = DayOfWeek.from(date);
        System.out.println("Day of week: " + dow);
        
        // Day of year
        int doy = date.get(ChronoField.DAY_OF_YEAR);
        System.out.println("Day of year: " + doy);
        
        // Month length
        int monthLength = date.lengthOfMonth();
        System.out.println("Days in month: " + monthLength);
        
        // Year length
        int yearLength = date.lengthOfYear();
        System.out.println("Days in year: " + yearLength);
        
        // Leap year
        System.out.println("Is leap year: " + date.isLeapYear());
    }
}

This example shows how to query various date fields from a ThaiBuddhistDate. The day-of-week values match the ISO calendar. Month and year lengths follow the same rules as the Gregorian calendar.

Source

Java ThaiBuddhistDate Class Documentation

In this article, we've covered the essential methods and features of the Java ThaiBuddhistDate class. Understanding these concepts is crucial for working with Thai Buddhist calendar dates in Java applications.

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.