Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
Date-Time API 提供了四个专门处理日期信息的类,而不考虑时间或时区。这些类的使用是由类名建议的:LocalDate,YearMonth,MonthDay 和 Year。
LocalDate 表示 ISO 日历中的年 - 月 - 日,对于表示没有时间的日期很有用。你可以使用 LocalDate 来跟踪重要事件,例如出生日期或结婚日期。以下示例使用 of 和 with 方法创建 LocalDate 的实例:
LocalDate date = LocalDate.of(2000, Month.NOVEMBER, 20); LocalDate nextWed = date.with(TemporalAdjusters.next(DayOfWeek.WEDNESDAY));
有关 TemporalAdjuster 接口的更多信息,请参阅 Temporal Adjuster。
除了通常的方法之外,LocalDate 类提供了获取有关给定日期的信息的 getter 方法。getDayOfWeek 方法返回特定日期所在的星期几。例如,以下代码行返回“MONDAY”:
DayOfWeek dotw = LocalDate.of(2012, Month.JULY, 9).getDayOfWeek();
以下示例使用 TemporalAdjuster 获取特定日期之后的第一个星期三。
LocalDate date = LocalDate.of(2000, Month.NOVEMBER, 20); TemporalAdjuster adj = TemporalAdjusters.next(DayOfWeek.WEDNESDAY); LocalDate nextWed = date.with(adj); System.out.printf("For the date of %s, the next Wednesday is %s.%n", date, nextWed);
运行代码会产生以下结果:
For the date of 2000-11-20, the next Wednesday is 2000-11-22.
Period and Duration 部分也有使用 LocalDate 类的示例。
YearMonth 类表示特定年份的月份。以下示例使用 YearMonth.lengthOfMonth() 方法确定几年和月份组合的天数。
YearMonth date = YearMonth.now(); System.out.printf("%s: %d%n", date, date.lengthOfMonth()); YearMonth date2 = YearMonth.of(2010, Month.FEBRUARY); System.out.printf("%s: %d%n", date2, date2.lengthOfMonth()); YearMonth date3 = YearMonth.of(2012, Month.FEBRUARY); System.out.printf("%s: %d%n", date3, date3.lengthOfMonth());
此代码的输出如下所示:
2013-06: 30 2010-02: 28 2012-02: 29
MonthDay 类表示特定月份的日期,例如 1 月 1 日的新年。
以下示例使用 MonthDay.isValidYear 方法确定 2 月 29 日是否对 2010 年有效。该调用返回 false,确认 2010 年不是闰年。
MonthDay date = MonthDay.of(Month.FEBRUARY, 29); boolean validLeapYear = date.isValidYear(2010);
Year 类代表一年。以下示例使用 Year.isLeap 方法确定给定年份是否为闰年。该调用返回 true,确认 2012 年是闰年。
boolean validLeapYear = Year.of(2012).isLeap();