Java MonthDay 类
最后修改时间:2025 年 4 月 16 日
java.time.MonthDay 类表示月份和日期的组合,不包含年份或时间。 它用于表示像生日或节日这样的重复性年度日期。 MonthDay 独立于任何年份处理月份和日期的值。
MonthDay 是不可变的且线程安全的。 它根据月份验证日期值,必要时考虑闰年。 该类遵循 ISO-8601 历法系统,并提供用于比较、格式化和解析的方法。
MonthDay 类概述
MonthDay 提供了创建、解析和操作月日组合的方法。 关键操作包括检查有效性、比较日期以及与年份结合。 该类正确处理月份长度,包括闰年中的二月。
public final class MonthDay implements TemporalAccessor, TemporalAdjuster,
Comparable<MonthDay>, Serializable {
public static MonthDay now();
public static MonthDay now(ZoneId zone);
public static MonthDay of(int month, int dayOfMonth);
public static MonthDay of(Month month, int dayOfMonth);
public static MonthDay parse(CharSequence text);
public int getMonthValue();
public Month getMonth();
public int getDayOfMonth();
public boolean isValidYear(int year);
public boolean isAfter(MonthDay other);
public boolean isBefore(MonthDay other);
public String format(DateTimeFormatter formatter);
}
上面的代码显示了 MonthDay 提供的主要方法。 这些方法允许创建、比较和格式化月日组合。 该类确保日期值对其各自的月份有效。
创建 MonthDay 对象
MonthDay 对象可以通过多种方式创建。 最常用的方法是 now 用于当前月日,以及用于特定组合的工厂方法。 还支持从字符串解析。
package com.zetcode;
import java.time.Month;
import java.time.MonthDay;
public class Main {
public static void main(String[] args) {
// Current month-day
MonthDay current = MonthDay.now();
System.out.println("Current month-day: " + current);
// From month number and day
MonthDay md1 = MonthDay.of(12, 25);
System.out.println("Christmas: " + md1);
// From Month enum and day
MonthDay md2 = MonthDay.of(Month.FEBRUARY, 29);
System.out.println("Leap day: " + md2);
// From string
MonthDay parsed = MonthDay.parse("--04-01");
System.out.println("Parsed from string: " + parsed);
}
}
此示例演示了创建 MonthDay 对象的不同方法。 输出显示了 ISO-8601 格式的月日组合(--MM-DD)。 请注意,即使在没有特定年份上下文的情况下创建,二月 29 日也是有效的。
获取 MonthDay 组件
一个 MonthDay 可以分解为其月份和日期组件。 月份可以作为数值或 Month 枚举检索。 这些值对于显示或进一步计算很有用。
package com.zetcode;
import java.time.Month;
import java.time.MonthDay;
public class Main {
public static void main(String[] args) {
MonthDay monthDay = MonthDay.of(Month.NOVEMBER, 11);
// Get month as number
int monthValue = monthDay.getMonthValue();
System.out.println("Month number: " + monthValue);
// Get month as enum
Month month = monthDay.getMonth();
System.out.println("Month: " + month);
// Get day of month
int day = monthDay.getDayOfMonth();
System.out.println("Day: " + day);
// Check validity for a specific year
boolean isValid2023 = monthDay.isValidYear(2023);
System.out.println("Valid for 2023: " + isValid2023);
}
}
此示例显示了如何从 MonthDay 中提取组件。 isValidYear 方法检查该日期是否存在于指定的年份,这对于二月 29 日很重要。 所有 getter 方法都返回不可变值。
比较 MonthDay
可以比较 MonthDay 以确定一年中的时间顺序。 该类提供了 isBefore、isAfter 和 compareTo 方法。 这些比较对于排序或查找日期范围很有用。
package com.zetcode;
import java.time.MonthDay;
public class Main {
public static void main(String[] args) {
MonthDay christmas = MonthDay.of(12, 25);
MonthDay newYearsEve = MonthDay.of(12, 31);
MonthDay independenceDay = MonthDay.of(7, 4);
System.out.println("Christmas before New Year's Eve: " +
christmas.isBefore(newYearsEve));
System.out.println("Independence Day after Christmas: " +
independenceDay.isAfter(christmas));
System.out.println("Comparison result: " +
christmas.compareTo(independenceDay));
// Equality check
MonthDay anotherChristmas = MonthDay.parse("--12-25");
System.out.println("Christmas equals: " +
christmas.equals(anotherChristmas));
}
}
此示例演示了比较 MonthDay 对象的各种方法。 比较方法同时考虑月份和日期组件。 请注意,相等性需要月份和日期完全匹配。
与年份结合
MonthDay 可以与年份结合以创建 LocalDate。 当您需要处理年度日期的特定出现时,这很有用。 该类在组合时正确处理闰年。
package com.zetcode;
import java.time.LocalDate;
import java.time.MonthDay;
import java.time.Year;
public class Main {
public static void main(String[] args) {
MonthDay feb29 = MonthDay.of(2, 29);
// Combine with specific year
LocalDate leapDate = feb29.atYear(2020);
System.out.println("Leap year date: " + leapDate);
// Try non-leap year
try {
LocalDate invalidDate = feb29.atYear(2023);
System.out.println("Non-leap year date: " + invalidDate);
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
// Using Year class
LocalDate date2024 = feb29.atYear(Year.of(2024).getValue());
System.out.println("Next leap year: " + date2024);
}
}
此示例显示了如何将 MonthDay 与年份结合以创建 LocalDate 对象。 atYear 方法对无效组合(例如非闰年的二月 29 日)抛出异常。 在处理闰日时,请务必进行验证。
格式化和解析
MonthDay 支持通过 DateTimeFormatter 进行格式化和解析。 这允许自定义显示格式和解析各种字符串表示。 ISO-8601 格式为 --MM-DD。
package com.zetcode;
import java.time.MonthDay;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
MonthDay monthDay = MonthDay.of(10, 31);
// Default format
String isoFormat = monthDay.toString();
System.out.println("ISO format: " + isoFormat);
// Custom format
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd", Locale.US);
String customFormat = monthDay.format(formatter);
System.out.println("Custom format: " + customFormat);
// Parse custom format
MonthDay parsed = MonthDay.parse("Nov 11",
DateTimeFormatter.ofPattern("MMM dd", Locale.US));
System.out.println("Parsed from custom format: " + parsed);
// Parse with different pattern
MonthDay parsed2 = MonthDay.parse("01/15",
DateTimeFormatter.ofPattern("MM/dd"));
System.out.println("Parsed with slash: " + parsed2);
}
}
此示例演示了格式化和解析 MonthDay 对象。 format 方法创建格式化的字符串,而 parse 可以处理各种输入格式。 始终为与区域设置相关的模式指定 Locale。
验证日期
MonthDay 自动根据其月份验证日期值。 额外的验证可以检查 MonthDay 对于特定年份是否有效。 这对于二月 29 日尤其重要。
package com.zetcode;
import java.time.MonthDay;
public class Main {
public static void main(String[] args) {
MonthDay feb29 = MonthDay.of(2, 29);
// Check validity for various years
System.out.println("Valid in 2020 (leap year): " + feb29.isValidYear(2020));
System.out.println("Valid in 2023: " + feb29.isValidYear(2023));
System.out.println("Valid in 2024: " + feb29.isValidYear(2024));
// Try creating invalid month-day
try {
MonthDay invalid = MonthDay.of(4, 31);
System.out.println("Created invalid month-day: " + invalid);
} catch (Exception e) {
System.out.println("Error creating invalid date: " + e.getMessage());
}
// Check day existence in month
MonthDay april30 = MonthDay.of(4, 30);
System.out.println("April 30 exists: " +
(april30.getDayOfMonth() == 30));
}
}
此示例显示了 MonthDay 验证功能。 isValidYear 方法针对特定年份检查二月 29 日。 MonthDay 构造会自动拒绝无效的日期-月份组合,例如四月 31 日。
来源
在本文中,我们介绍了 Java MonthDay 类的基本方法和功能。 了解这些概念对于在 Java 应用程序中处理重复日期至关重要。
作者
列出所有Java教程。