ZetCode

Java 民国日期类

最后修改时间:2025 年 4 月 16 日

java.time.chrono.MinguoDate 类表示民国历中的日期。该历法主要用于台湾,年份从 1912 年(中华民国成立)开始计算。

MinguoDate 是不可变的,并且是线程安全的。它遵循与其他 Java 时间类相同的设计原则。民国历是一种太阳历,其月份结构与公历相同。

MinguoDate 类概述

MinguoDate 提供了在民国系统中创建、操作和格式化日期的方法。关键操作包括日期算术、字段访问以及转换为其他历法系统。该类处理从公元 1 年开始的日期。

public final class MinguoDate implements ChronoLocalDate, Serializable {
    public static MinguoDate now();
    public static MinguoDate now(ZoneId zone);
    public static MinguoDate now(Clock clock);
    public static MinguoDate of(int prolepticYear, int month, int dayOfMonth);
    public static MinguoDate from(TemporalAccessor temporal);
    public static MinguoDate parse(CharSequence text);
    public int getChronology();
    public int getEra();
    public int getYear();
    public int getMonthValue();
    public int getDayOfMonth();
}

上面的代码显示了 MinguoDate 提供的一些关键方法。这些方法允许创建、访问字段以及在不同历法系统之间进行转换。该类与 Java 的标准日期时间 API 集成。

创建 MinguoDate 对象

可以采用多种方式创建 MinguoDate 对象。最常用的方法是使用 now 获取当前日期,以及使用工厂方法创建特定日期。也支持从字符串解析。

Main.java
package com.zetcode; 

import java.time.chrono.MinguoDate;
import java.time.ZoneId;

public class Main {

    public static void main(String[] args) {
        
        // Current date
        MinguoDate today = MinguoDate.now();
        System.out.println("Today in Minguo: " + today);
        
        // Specific date
        MinguoDate founding = MinguoDate.of(1, 1, 1);
        System.out.println("Republic founding: " + founding);
        
        // From system clock with zone
        MinguoDate nowInTokyo = MinguoDate.now(ZoneId.of("Asia/Tokyo"));
        System.out.println("Now in Tokyo: " + nowInTokyo);
        
        // From string
        MinguoDate parsed = MinguoDate.parse("Minguo 112-04-16");
        System.out.println("Parsed date: " + parsed);
    }
}

此示例演示了创建 MinguoDate 对象的不同方法。输出显示了民国历格式的日期。请注意,民国 1 年对应公历的 1912 年。

访问日期组件

MinguoDate 可以分解为年、月和日组成部分。这些值表示民国历中的日期。这些方法与其他 Java 日期类类似。

Main.java
package com.zetcode; 

import java.time.chrono.MinguoDate;
import java.time.chrono.MinguoEra;

public class Main {

    public static void main(String[] args) {

        MinguoDate date = MinguoDate.now();
        
        // Get year (Minguo era)
        int year = date.getYear();
        System.out.println("Minguo year: " + year);
        
        // Get month (1-12)
        int month = date.getMonthValue();
        System.out.println("Month: " + month);
        
        // Get day of month
        int day = date.getDayOfMonth();
        System.out.println("Day: " + day);
        
        // Get era (BEFORE_ROC or ROC)
        MinguoEra era = date.getEra();
        System.out.println("Era: " + era);
    }
}

此示例演示了如何从 MinguoDate 中提取组成部分。纪元可以是中华民国 (ROC) 或中华民国前 (BEFORE_ROC)。大多数日期将从民国 1 年开始属于 ROC 纪元。

在日历之间转换

MinguoDate 可以与其他历法系统(如公历)互相转换。在应用程序中使用多个历法系统时,这些转换是必不可少的。

Main.java
package com.zetcode; 

import java.time.LocalDate;
import java.time.chrono.MinguoDate;

public class Main {

    public static void main(String[] args) {

        MinguoDate minguoToday = MinguoDate.now();
        
        // Convert to LocalDate (Gregorian)
        LocalDate gregorianDate = LocalDate.from(minguoToday);
        System.out.println("Gregorian date: " + gregorianDate);
        
        // Convert back to MinguoDate
        MinguoDate backToMinguo = MinguoDate.from(gregorianDate);
        System.out.println("Back to Minguo: " + backToMinguo);
        
        // Specific conversion example
        MinguoDate minguoNewYear = MinguoDate.of(112, 1, 1);
        LocalDate gregorianNewYear = LocalDate.from(minguoNewYear);
        System.out.println("Minguo 112 New Year: " + gregorianNewYear);
    }
}

此示例演示了 MinguoDate 和公历日期之间的转换。转换保留了相同的绝对日期,同时更改了历法系统表示。

日期算术

MinguoDate 通过 plusminus 方法支持日期算术。这些操作对于计算未来或过去的日期很有用。该类正确处理月份和年份的边界。

Main.java
package com.zetcode; 

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

public class Main {

    public static void main(String[] args) {

        MinguoDate today = MinguoDate.now();
        
        // Add 1 week
        MinguoDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
        System.out.println("Next week: " + nextWeek);
        
        // Subtract 3 months
        MinguoDate threeMonthsAgo = today.minus(3, ChronoUnit.MONTHS);
        System.out.println("Three months ago: " + threeMonthsAgo);
        
        // Add 2 years
        MinguoDate inTwoYears = today.plus(2, ChronoUnit.YEARS);
        System.out.println("In two years: " + inTwoYears);
        
        // Mixed operations
        MinguoDate complex = today.plus(1, ChronoUnit.MONTHS)
                                .minus(10, ChronoUnit.DAYS);
        System.out.println("Complex operation result: " + complex);
    }
}

此示例显示了使用 MinguoDate 执行日期算术的各种方法。操作可以使用 ChronoUnit 常量来表示不同的时间单位。所有计算都遵守历法规则。

比较日期

可以比较 MinguoDate 对象来确定时间顺序。该类提供了 isBeforeisAftercompareTo 方法。这些比较与其他的 Java 日期类一样工作。

Main.java
package com.zetcode; 

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

public class Main {

    public static void main(String[] args) {

        MinguoDate today = MinguoDate.now();
        MinguoDate tomorrow = today.plus(1, ChronoUnit.DAYS);
        MinguoDate 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
        MinguoDate sameDate = MinguoDate.of(today.getYear(), 
            today.getMonthValue(), today.getDayOfMonth());
        System.out.println("Today equals sameDate: " + today.equals(sameDate));
    }
}

此示例演示了各种比较 MinguoDate 对象的方法。比较方法会考虑完整的日期值。请注意,相等性需要所有日期组成部分完全匹配。

格式化民国日期

可以使用 DateTimeFormatter 格式化 MinguoDate。特殊模式字母可用于民国特有的字段,如纪元和年份。格式化遵循与其他 Java 日期类相同的原则。

Main.java
package com.zetcode; 

import java.time.chrono.MinguoDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {

    public static void main(String[] args) {

        MinguoDate date = MinguoDate.now();
        
        // Default format
        String defaultFormat = date.toString();
        System.out.println("Default format: " + defaultFormat);
        
        // Custom format
        DateTimeFormatter formatter = DateTimeFormatter
            .ofPattern("GGGG y年M月d日", Locale.TAIWAN);
        String customFormat = date.format(formatter);
        System.out.println("Custom format: " + customFormat);
        
        // Alternative format
        DateTimeFormatter altFormatter = DateTimeFormatter
            .ofPattern("'民國' y年 MM月 dd日");
        String altFormat = date.format(altFormatter);
        System.out.println("Alternative format: " + altFormat);
        
        // ISO format
        String isoFormat = date.format(DateTimeFormatter.ISO_DATE);
        System.out.println("ISO format: " + isoFormat);
    }
}

此示例显示了格式化 MinguoDate 对象的不同方法。格式化程序可以使用特定于区域设置的模式和文本。特殊模式字母处理民国历的细节。

来源

Java MinguoDate 类文档

在本文中,我们介绍了 Java MinguoDate 类的基本方法和功能。了解这些概念对于在台湾官方历法系统中处理日期至关重要。

作者

我叫 Jan Bodnar,是一位经验丰富的程序员,在编程领域拥有多年经验。我从 2007 年开始撰写编程文章,至今已撰写了 1,400 多篇文章和八本电子书。凭借超过八年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程