Java LocalDate
最后修改日期:2024 年 7 月 10 日
在本文中,我们将展示如何在 Java 中使用 LocalDate。 我们将计算当前的本地日期、解析本地日期、格式化本地日期、比较本地日期并进行日期运算。
LocalDate 是 ISO-8601 日历系统中没有时区的日期,例如 2024-05-22。LocalDate
是一个不可变的日期时间对象。
LocalDate
不存储或表示时间或时区。 它是墙上时钟上看到的本地日期的描述。
应使用 equals
方法进行比较。
当前日期
当前日期使用 LocalDate.now
检索。
import java.time.LocalDate; void main() { LocalDate now = LocalDate.now(); System.out.println(now); }
该示例打印本地当前日期。
$ java Main.java 2024-07-10
创建 LocalDate 对象
在 Java 中,有几种创建 LocalDate
的方法。
import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; void main() { // Current date LocalDate date1 = LocalDate.now(); System.out.println(date1); // Specific date LocalDate date2 = LocalDate.of(2021, 5, 20); System.out.println(date2); // Specific date LocalDate date3 = LocalDate.parse("2021-05-21", DateTimeFormatter.ISO_DATE); System.out.println(date3); // Retrieving from LocalDateTime LocalDate date4 = LocalDateTime.now().toLocalDate(); System.out.println(date4); }
该示例展示了生成 LocalDate
的四种方法。
LocalDate date1 = LocalDate.now();
LocalDate.now
创建当前的本地时间。
LocalDate date2 = LocalDate.of(2021, 5, 20);
使用 LocalDate.of
,我们可以从年、月和日的值创建一个特定的本地日期。
LocalDate date3 = LocalDate.parse("2021-05-21", DateTimeFormatter.ISO_DATE);
使用 LocalDate.parse
,我们从字符串解析 LocalDate
。
LocalDate date4 = LocalDateTime.now().toLocalDate();
也可以使用 toLocalDate
方法从 LocalDateTime
对象获取 LocalDate
。
$ java Main.java 2024-07-10 2021-05-20 2021-05-21 2024-07-10
LocalDate 年、月、日
以下示例将本地日期拆分为年、月和日部分。
import java.time.LocalDate; void main() { LocalDate date = LocalDate.now(); System.out.printf("Year: %s%n", date.getYear()); System.out.printf("Month: %s%n", date.getMonthValue()); System.out.printf("Day: %s%n", date.getDayOfMonth()); }
getYear
获取年份,getMonthValue
获取月份,getDayOfMonth
获取日期。
$ java Main.java Year: 2024 Month: 7 Day: 10
LocalDate 年、月、周的日期
在以下示例中,我们获取年、月和周的日期。
import java.time.LocalDate; void main() { LocalDate now = LocalDate.now(); System.out.println(now); System.out.printf("Day of year: %s%n", now.getDayOfYear()); System.out.printf("Day of month: %s%n", now.getDayOfMonth()); System.out.printf("Day of week: %s%n", now.getDayOfWeek()); }
要执行此任务,我们使用 getDayOfYear
、getDayOfMonth
和 getDayOfWeek
方法。
$ java Main.java 2024-07-10 Day of year: 192 Day of month: 10 Day of week: WEDNESDAY
LocalDate & DateTimeFormatter
不同的国家/地区使用不同的日期格式。 DateTimeFormatter
帮助我们格式化日期。
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; import java.util.Locale; void main() { LocalDate now = LocalDate.now(); DateTimeFormatter df = DateTimeFormatter.ISO_DATE; System.out.println(now.format(df)); DateTimeFormatter df2 = DateTimeFormatter.ISO_ORDINAL_DATE; System.out.println(now.format(df2)); DateTimeFormatter df3 = DateTimeFormatter.ofPattern("dd LLLL yyyy"); System.out.println(now.format(df3)); DateTimeFormatter df4 = DateTimeFormatter.ofPattern("dd/MM/yyyy"); System.out.println(now.format(df4)); System.out.println("----------------------"); LocalDate day = LocalDate.of(2020, 9, 20); System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL) .withLocale(Locale.FRENCH).format(day)); System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG) .withLocale(Locale.FRENCH).format(day)); System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM) .withLocale(Locale.FRENCH).format(day)); System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT) .withLocale(Locale.FRENCH).format(day)); }
该示例使用 DateTimeFormatter
格式化日期。
DateTimeFormatter df = DateTimeFormatter.ISO_DATE; System.out.println(now.format(df));
我们将时间格式化为 ISO_DATE
格式日期标准。
DateTimeFormatter df3 = DateTimeFormatter.ofPattern("dd LLLL yyyy"); System.out.println(now.format(df3));
我们可以使用 DateTimeFormatter.ofPattern
选择自定义日期格式。 DateTimeFormatter
的文档包含我们可以使用的各种格式化字符的描述。
System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL) .withLocale(Locale.FRENCH).format(day));
使用 ofLocalizedDate
方法,我们有一个特定于区域设置的日期格式。
$ java Main.java 2024-07-10 2024-192 10 júl 2024 10/07/2024 ---------------------- dimanche 20 septembre 2020 20 septembre 2020 20 sept. 2020 20/09/2020
LocalDate 算术
Java LocalDate
具有执行日期算术的方法。
import java.time.LocalDate; void main() { LocalDate now = LocalDate.now(); System.out.println("Current date: " + now); // LocalDate addition System.out.println("Adding 3 days: " + now.plusDays(3)); System.out.println("Adding 12 months: " + now.plusMonths(12)); System.out.println("Adding 45 weeks: " + now.plusWeeks(45)); System.out.println("Adding 4 years: " + now.plusYears(4)); System.out.println("----------------------"); // LocalDate subtraction System.out.println("Subtracting 3 days: " + now.minusDays(3)); System.out.println("Subtracting 12 months: " + now.minusMonths(12)); System.out.println("Subtracting 45 weeks: " + now.minusWeeks(45)); System.out.println("Subtracting 4 years: " + now.minusYears(4)); }
该示例展示了添加和减去日期单位的方法。
System.out.println("Adding 3 days: " + now.plusDays(3));
plusDays
将三天添加到当前的本地日期。
System.out.println("Subtracting 3 days: " + now.minusDays(3));
同样,minusDays
从当前的本地日期中减去三天。
$ java Main.java Current date: 2024-07-10 Adding 3 days: 2024-07-13 Adding 12 months: 2025-07-10 Adding 45 weeks: 2025-05-21 Adding 4 years: 2028-07-10 ---------------------- Subtracting 3 days: 2024-07-07 Subtracting 12 months: 2023-07-10 Subtracting 45 weeks: 2023-08-30 Subtracting 4 years: 2020-07-10
LocalDate until
使用 until
方法,我们可以计算指定单位下到另一个日期的日期。
import java.time.LocalDate; import java.time.temporal.ChronoUnit; void main() { LocalDate d1 = LocalDate.of(2021, 5, 22); LocalDate d2 = LocalDate.parse("2021-12-25"); System.out.printf("%s days%n", d1.until(d2, ChronoUnit.DAYS)); System.out.printf("%s months%n", d1.until(d2, ChronoUnit.MONTHS)); System.out.printf("%s years%n", d1.until(d2, ChronoUnit.YEARS)); }
该示例计算到另一个日期需要经过的天数、月数和年数。
System.out.printf("%s days%n", d1.until(d2, ChronoUnit.DAYS));
使用 ChronoUnit.DAYS
,我们指定以天为单位计算日期差。
$ java Main.java 217 days 7 months 0 years
比较 LocalDate 对象
以下示例展示了如何比较日期。
import java.time.LocalDate; void main() { LocalDate d1 = LocalDate.of(2020, 2, 12); LocalDate d2 = LocalDate.of(2021, 3, 15); LocalDate d3 = LocalDate.of(2021, 5, 22); if (d1.compareTo(d2) == 0) { System.out.println("date1 and date2 are equal"); } else { System.out.println("date1 and date2 are not equal"); } if (d2.isBefore(d3)) { System.out.println("date2 comes before date3"); } else { System.out.println("date2 does not come before date3"); } if (d3.isAfter(d1)) { System.out.println("date3 comes after date1"); } else { System.out.println("date3 does not come after date1"); } }
该示例比较日期。 我们检查它们是否相等,是否在另一个日期之前或之后。
if (d1.compareTo(d2) == 0) {
compareTo
比较两个本地日期。
if (d2.isBefore(d3)) {
isBefore
检查日期是否在另一个日期之前。
if (d3.isAfter(d1)) {
isAfter
检查日期是否在另一个日期之后。
$ java Main.java date1 and date2 are not equal date2 comes before date3 date3 comes after date1
LocalDate datesUntil
datesUntil
方法返回一个顺序排序的日期流。 返回的流从开始日期(包括)开始,到结束日期(不包括)结束,增量步长为一天。
import java.time.LocalDate; void main() { LocalDate start = LocalDate.of(2021, 4, 5); LocalDate end = LocalDate.of(2021, 5, 22); start.datesUntil(end).forEach(System.out::println); }
在该示例中,我们打印两个指定日期之间的所有日期。
$ java Main.java 2021-04-05 2021-04-06 2021-04-07 2021-04-08 ... 2021-05-20 2021-05-21
LocalDate 范围
range
方法获取指定字段的有效值的范围。
import java.time.LocalDate; import java.time.temporal.ChronoField; import java.time.temporal.ValueRange; void main () { LocalDate d = LocalDate.of(2021, 5, 22); ValueRange r = d.range(ChronoField.DAY_OF_MONTH); System.out.printf("DAY_OF_MONTH: %s%n", r); r = d.range(ChronoField.DAY_OF_WEEK); System.out.printf("DAY_OF_WEEK: %s%n", r); r = d.range(ChronoField.YEAR); System.out.printf("YEAR: %s%n", r); r = d.range(ChronoField.DAY_OF_YEAR); System.out.printf("DAY_OF_YEAR: %s%n", r); r = d.range(ChronoField.YEAR_OF_ERA); System.out.printf("YEAR_OF_ERA: %s%n", r); r = d.range(ChronoField.ERA); System.out.printf("ERA: %s%n", r); }
我们获取各种字段的范围,包括 DAY_OF_MONTH
、YEAR
和 DAY_OF_YEAR
。
$ java Main.java DAY_OF_MONTH: 1 - 31 DAY_OF_WEEK: 1 - 7 YEAR: -999999999 - 999999999 DAY_OF_YEAR: 1 - 365 YEAR_OF_ERA: 1 - 999999999 ERA: 0 - 1
LocalDate 查询
query
方法使用指定的查询来查询日期。 它们用于从时间对象中提取信息。
import java.time.LocalDate; import java.time.Month; import java.time.temporal.ChronoField; import java.time.temporal.TemporalAccessor; import java.time.temporal.TemporalQuery; import java.util.List; void main() { var dates = List.of(LocalDate.of(2020, 9, 1), LocalDate.of(2020, 1, 15), LocalDate.of(2020, 1, 1), LocalDate.of(2020, 11, 14), LocalDate.of(2020, 12, 24), LocalDate.of(2020, 3, 6), LocalDate.of(2020, 8, 8), LocalDate.of(2020, 12, 16), LocalDate.of(2020, 5, 8), LocalDate.of(2020, 10, 21)); dates.forEach(d -> { checkBirthday(d); }); } void checkBirthday(LocalDate d) { Boolean isBirthday = d.query(new Birthdays()); if (isBirthday.booleanValue()) { System.out.printf("%s is a family birthday%n", d); } else { System.out.printf("%s is not a family birthday%n", d); } } class Birthdays implements TemporalQuery<Boolean> { @Override public Boolean queryFrom(TemporalAccessor ta) { int month = ta.get(ChronoField.MONTH_OF_YEAR); int day = ta.get(ChronoField.DAY_OF_MONTH); if ((month == Month.JANUARY.getValue()) && day == 15) { return Boolean.TRUE; } if ((month == Month.MARCH.getValue()) && day == 6) { return Boolean.TRUE; } if ((month == Month.MAY.getValue()) && day == 19) { return Boolean.TRUE; } if ((month == Month.AUGUST.getValue()) && day == 8) { return Boolean.TRUE; } if ((month == Month.OCTOBER.getValue()) && day == 21) { return Boolean.TRUE; } return Boolean.FALSE; } }
在该示例中,我们检查家庭成员是否在指定日期有生日。
var dates = List.of(LocalDate.of(2020, 9, 1), LocalDate.of(2020, 9, 15), LocalDate.of(2020, 1, 1), LocalDate.of(2020, 11, 14), LocalDate.of(2020, 12, 24), LocalDate.of(2020, 5, 1), LocalDate.of(2020, 12, 17), LocalDate.of(2020, 12, 16), LocalDate.of(2020, 5, 8), LocalDate.of(2020, 6, 19));
我们有一个日期列表。
dates.forEach(d -> { checkBirthday(d); });
我们遍历列表并使用 checkBirthday
检查每个元素是否是家庭生日。
Boolean isBirthday = d.query(new Birthdays()); if (isBirthday.booleanValue()) { System.out.printf("%s is a holiday in Slovakia%n", d); } else { System.out.printf("%s is not a holiday in Slovakia%n", d); }
我们使用 query
方法查询当前日期; 我们将该方法传递给 TemporalQuery
。
class Birthdays implements TemporalQuery<Boolean> { @Override public Boolean queryFrom(TemporalAccessor ta) { int month = ta.get(ChronoField.MONTH_OF_YEAR); int day = ta.get(ChronoField.DAY_OF_MONTH); if ((month == Month.JANUARY.getValue()) && day == 15) { return Boolean.TRUE; } ... return Boolean.FALSE; } }
在 TemporalQuery's
queryFrom
方法中,我们指定该方法返回 true 的日期(生日)。
$ java Main.java 2020-09-01 is not a family birthday 2020-01-15 is a family birthday 2020-01-01 is not a family birthday 2020-11-14 is not a family birthday 2020-12-24 is not a family birthday 2020-03-06 is a family birthday 2020-08-08 is a family birthday 2020-12-16 is not a family birthday 2020-05-08 is not a family birthday 2020-10-21 is a family birthday
来源
在本文中,我们使用了 Java LocalDate。
作者
列出所有Java教程。