Java LocalDate 详解
- LocalDate - 初始化
- plus - 按给定数量增加日期值
- minus - 按给定数量减去日期值
- with - 调整日期
- get - 获取日期信息
- LocalDate format() 转换格式
- atTime() - 将 LocalDate 与时间结合转化为 LocalDateTime
- atStartOfDay() 将 LocalDate 转化为 LocalDateTime
- LocalDate isAfter(), isBefore() and isEqual() 比较日期
- LocalDate isLeapYear(), isSupported() 检查闰年和输入域
- LocalDate lengthOfMonth(), lengthOfYear() 检查月份和年份天数最大值
- LocalDate datesUntil() 返回指定时间段
- LocalDate until() 计算两个日期之间的时间量
- LocalDate compareTo() and equals() 比较日期
- LocalDate adjustInto() 复制日期
- LocalDate query() 查询日期
- LocalDate range() 字段有效值范围。
- LocalDate toEpochDay() and toEpochSecond()
- 参考文献
本页将介绍java.time.LocalDate
的例子。
在Java 8
中引入的LocalDate
表示一个格式为yyyy-MM-dd
的日期,如2021-06-13
。
它不存储时间或时区。
LocalDate
是一个不可变的类,它是对日期的描述,如生日。
LocalDate
是一个基于值的类,要比较LocalDate
的两个实例,我们应该使用它的equals
方法。
我们可以从LocalDate
中获取许多其他的日期字段,如年日 (day-of-year
)、周日 (day-of-week
)、月日 (month-of-year
) 等等。
LocalDate
的格式可以通过DateTimeFormatter
的格式方法来改变。
现在LocalDate
的方法有:atTime
、format
、getDayOfMonth
、getDayOfWeek
、minus
、plus
、equals
、compareTo
等。
例如,获取当前日期。
输出是2021-06-13
。
现在改变格式。
String formattedDate = localDate.format(DateTimeFormatter.ofPattern("MMM dd, yyyy"));
输出是 六月 13, 2021
。
在Java 9
中,LocalDate
被添加了更多的方法,如ofInstant
、datesUntil
、toEpochSecond
。在这一页,我们将讨论LocalDate
和它的方法,并举例说明。
LocalDate - 初始化
LocalDate
以年月日的格式输出,即yyyy-MM-dd
。
我们可以使用LocalDate
的下列静态方法来初始化LocalDate
。
1. now(): 给出 LocalDate 实例,该实例包含默认时区的系统时钟的当前日期。
LocalDate localDate = LocalDate.now();
System.out.println(localDate);
输出
2021-06-13
2. now(Clock clock): 提供 LocalDate 实例,该实例具有从指定时钟获得的当前日期。
LocalDate localDate = LocalDate.now(Clock.systemUTC());
Clock.systemUTC()
将返回Clock
实例。
3. now(ZoneId zone): 给出当前日期的LocalDate
实例,该日期来自指定时区的系统时钟。
LocalDate localDate = LocalDate.now(ZoneId.systemDefault());
4. of(int year, int month, int dayOfMonth: 从给定的年、月、日中获得LocalDate
实例,输入数据类型为int
。
LocalDate localDate = LocalDate.of(2018, 11, 30);
输出为2018-11-30
。
5. of(int year, Month month, int dayOfMonth): 从给定的年(int
)、月(Month
)和日(int
)给出LocalDate
实例。
LocalDate localDate = LocalDate.of(2018, Month.NOVEMBER, 30);
输出为2018-11-30
。
6. ofEpochDay(long epochDay): 从给定的纪元日数中给出LocalDate
实例。
LocalDate localDate = LocalDate.ofEpochDay(500);
输出为1971-05-16
。
7. ofInstant(Instant instant, ZoneId zone): 从给定的Instant
和ZoneId
给出LocalDate
实例。
LocalDate localDate = LocalDate.ofInstant(Instant.now(), ZoneId.systemDefault());
注
:ofInstant
在Java 9
中被引入。
8. ofYearDay(int year, int dayOfYear): 从给定的年份和年份中的天数给出LocalDate
实例,输入数据类型为int
。
LocalDate localDate = LocalDate.ofYearDay(2018, 02);
输出为2018-01-02
,即2018
年第二天的日期。
9. parse(CharSequence text): 从给定的文本字符串,如 "2018-10-01"
,给出LocalDate
实例。
LocalDate localDate = LocalDate.parse("2018-10-01");
输出为2018-10-01
。
10. parse(CharSequence text, DateTimeFormatter formatter): 从给定格式的文本字符串中获得LocalDate
实例。输出的LocalDate
将是yyyy-MM-dd
格式。
LocalDate localDate = LocalDate.parse("15-03-2018", DateTimeFormatter.ofPattern("dd-MM-yyyy"));
输出为2018-03-15
。
11. from(TemporalAccessor temporal): 从给定的时间对象中获得LocalDate
实例。
LocalDate localDate = LocalDate.from(LocalDate.now());
plus - 按给定数量增加日期值
1. plus(long amountToAdd, TemporalUnit unit): 通过增加给定的数量返回LocalDate
实例。
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class LocalDateDemo {
public static void main(String[] args) {
LocalDate localDate1 = LocalDate.now();
System.out.println(localDate1);
LocalDate localDate2 = localDate1.plus(15, ChronoUnit.DAYS);
System.out.println(localDate2);
}
}
输出
2021-06-13
2021-06-28
在上面的例子中,我们在当前日期中增加了15
天。
2. plus(TemporalAmount amountToAdd): 通过添加指定的TemporalAmount
返回LocalDate
实例。
LocalDate localDate1 = LocalDate.now();
System.out.println(localDate1);
LocalDate localDate2 = localDate1.plus(Period.ofDays(15));
System.out.println(localDate2);
输出
2021-06-13
2021-06-28
在上面的代码中,我们给localDate1
增加了15
天,得到localDate2
作为LocalDate
的实例。
3. plusDays(long daysToAdd): 通过添加指定的天数返回LocalDate
实例。
LocalDate localDate1 = LocalDate.parse("2018-11-05");
LocalDate localDate2 = localDate1.plusDays(15);
System.out.println(localDate2);
输出为2018-11-20
。
4. plusWeeks(long weeksToAdd): 通过添加指定的周数返回 LocalDate
实例,用法与plusDays
类似。
5. plusMonths(long monthsToAdd): 通过添加指定的月数返回 LocalDate
实例,用法与plusDays
类似。
6. plusYears(long yearsToAdd): ,通过添加指定的年数返回 LocalDate
实例,用法与plusDays
类似。
minus - 按给定数量减去日期值
1. minus(long amountToSubtract, TemporalUnit unit): 通过减去给定的数量返回LocalDate
实例。
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class LocalDateDemo {
public static void main(String[] args) {
LocalDate localDate1 = LocalDate.now();
System.out.println(localDate1);
LocalDate localDate2 = localDate1.minus(15, ChronoUnit.DAYS);
System.out.println(localDate2);
}
}
输出
2018-12-02
2018-11-17
在上面的例子中,我们在当前日期中减少了15
天。
2. minus(TemporalAmount amountToSubtract): 通过减去指定的TemporalAmount
返回LocalDate
实例。
LocalDate localDate1 = LocalDate.now();
System.out.println(localDate1);
LocalDate localDate2 = localDate1.minus(Period.ofDays(15));
System.out.println(localDate2);
输出
2018-12-02
2018-11-17
在上面的代码中,我们给localDate1
减少了15
天,得到localDate2
作为LocalDate
的实例。
3. minusDays(long daysToSubtract): 通过减少指定的天数返回LocalDate
实例。
LocalDate localDate1 = LocalDate.parse("2018-11-05");
LocalDate localDate2 = localDate1.minusDays(15);
System.out.println(localDate2);
输出为2018-10-21
。
4. minusWeeks(long weeksToSubtract): 通过减少指定的周数返回 LocalDate
实例,用法与minusDays
相似。
5. minusMonths(long monthsToSubtract): 通过减少指定的月数返回 LocalDate
实例,用法与minusDays
相似。
6. minusYears(long yearsToSubtract): ,通过减少指定的年数返回 LocalDate
实例,用法与minusDays
相似。
with - 调整日期
查看LocalDate
方法,这些方法将返回具有指定值的LocalDate
调整,或为给定的日期字段设置一个新值。
1. with(TemporalAdjuster adjuster): 返回用给定的TemporalAdjuster
调整的LocalDate
实例。
LocalDate localDate1 = LocalDate.now();
System.out.println(localDate1);
LocalDate localDate2 = localDate1.with(DayOfWeek.SUNDAY);
System.out.println(localDate2);
输出
2018-12-03
2018-12-09
在上面的代码中,我们使用with
方法改变了当前日期的日期。在当前日期的输出中,它是星期一。
通过调整星期日,我们得到一个新的日期。
2. with(TemporalField field, long newValue): 将指定字段的LocalDate
实例返回到一个新值。
LocalDate localDate1 = LocalDate.now();
System.out.println(localDate1);
LocalDate localDate2 = localDate1.with(ChronoField.YEAR, 2017);
System.out.println(localDate2);
输出
2018-12-03
2017-12-03
在上面的代码中,我们为年份设置了新的值。
3. withDayOfMonth(int dayOfMonth): 通过用给定的值改变月份中的号数来返回LocalDate
实例。
LocalDate localDate1 = LocalDate.now();
System.out.println(localDate1);
LocalDate localDate2 = localDate1.withDayOfMonth(10);
System.out.println(localDate2);
输出
2018-12-03
2018-12-10
4. withDayOfYear(int dayOfYear): 通过使用给定值更改一年中的某一天来返回 LocalDate
实例。一年中的第几天的有效值为 1
到 365
,闰年的有效值为 1
到 366
。
LocalDate localDate1 = LocalDate.now();
System.out.println(localDate1);
LocalDate localDate2 = localDate1.withDayOfYear(110);
System.out.println(localDate2);
输出
2018-12-03
2018-04-20
在上面的例子中,我们想在当前日期中设置110
。输出的方式是,年不会改变,月和日将从1
月开始的第110
天中获得。
5. withMonth(int month): 通过用给定的值改变年的月份来返回LocalDate
实例。有效值是1
到12
。
LocalDate localDate1 = LocalDate.now();
System.out.println(localDate1);
LocalDate localDate2 = localDate1.withMonth(6);
System.out.println(localDate2);
输出
2018-12-03
2018-06-03
6. withYear(int year): 通过用给定值改变年份来返回 LocalDate 实例。
LocalDate localDate1 = LocalDate.now();
System.out.println(localDate1);
LocalDate localDate2 = localDate1.withYear(2017);
System.out.println(localDate2);
输出
2018-12-03
2017-12-03
get - 获取日期信息
创建一个LocalDate
实例,如下所示。
LocalDate localDate = LocalDate.now();
System.out.println(localDate);
假设它给出了以下数值。
2018-12-03
1. get(TemporalField field): 获取指定字段的int
值。
int val = localDate.get(ChronoField.YEAR);
System.out.println(val);
输出为2018
。
2. getChronology(): 获取该日期格式,例如:ISO
。
3. getDayOfMonth(): 获取一个月中的第几号,为int
类型。
int val = localDate.getDayOfMonth();
System.out.println(val);
输出为3
。
4. getDayOfWeek(): 获取星期字段,返回DayOfWeek
。
DayOfWeek val = localDate.getDayOfWeek();
System.out.println(val.name());
输出为MONDAY
。
5. getDayOfYear(): 以 int
格式获取一年中的第几天。它可以返回从 1
到 365
或 366
(闰年
)。
int val = localDate.getDayOfYear();
System.out.println(val);
输出为337
。
6. getEra(): 获取在此日期适用的时代。例如:"CE "
从第一年开始,"BCE "
从零年开始。
IsoEra val = localDate.getEra();
7. getLong(TemporalField field): 获取指定字段的值,返回long
类型。
long val = localDate.getLong(ChronoField.YEAR);
System.out.println(val);
输出为2018
。
8. getMonth(): 从这个日期获取一年中的月份,返回值为Month
类型。
Month val = localDate.getMonth();
System.out.println(val.name());
输出为DECEMBER
。
9. getMonthValue(): 获取月份,取值范围为1-12
的int
类型。
int val = localDate.getMonthValue();
System.out.println(val);
输出为12
。
10. getYear(): 获取年份,返回int
类型。
int val = localDate.getYear();
System.out.println(val);
输出为2018
。
LocalDate format() 转换格式
LocalDate
的默认日期格式为 yyyy-MM-dd
。
format
方法使用指定的格式化程序格式化日期。
找到它的声明。
String format(DateTimeFormatter formatter)
示例
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class LocalDateDemo {
public static void main(String[] args) {
LocalDate localDate = LocalDate.parse("2018-02-18");
String formattedDate = localDate.format(DateTimeFormatter.ofPattern("MMM dd, yyyy"));
System.out.println(formattedDate);
}
}
输出
二月 18, 2018
atTime() - 将 LocalDate 与时间结合转化为 LocalDateTime
atTime
方法将 LocalDate
与给定时间结合起来,并返回 LocalDateTime
实例。
我们可以将以下参数传递给 atTime
方法。
atTime(int hour, int minute)
atTime(int hour, int minute, int second)
atTime(int hour, int minute, int second, int nanoOfSecond)
atTime(LocalTime time)
示例
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class LocalDateDemo {
public static void main(String[] args) {
LocalDate localDate = LocalDate.parse("2018-05-02");
System.out.println(localDate);
//hour and minute
LocalDateTime localDateTime = localDate.atTime(16, 50);
System.out.println(localDateTime);
//hour, minute and second
localDateTime = localDate.atTime(16, 50, 20);
System.out.println(localDateTime);
//hour, minute, second and nanoOfSecond
localDateTime = localDate.atTime(16, 50, 20, 300);
System.out.println(localDateTime);
//Using LocalTime
localDateTime = localDate.atTime(LocalTime.now());
System.out.println(localDateTime);
}
}
输出
2018-05-02
2018-05-02T16:50
2018-05-02T16:50:20
2018-05-02T16:50:20.000000300
2018-05-02T17:53:24.952
我们还可以将 OffsetTime
传递给将返回 OffsetDateTime
实例的 atTime
。
OffsetDateTime offsetDateTime = localDate.atTime(OffsetTime.now());
System.out.println(offsetDateTime)
输出为2018-05-02T17:54:37.104+08:00
。
atStartOfDay() 将 LocalDate 转化为 LocalDateTime
atStartOfDay
方法将LocalDate
与00:00
的时间结合起来,在这个日期的开始创建LocalDateTime
实例。
为了得到ZonedDateTime
实例,我们需要将ZoneId
实例传递给atStartOfDay
方法。
找到atStartOfDay
方法的声明。
LocalDateTime atStartOfDay()
ZonedDateTime atStartOfDay(ZoneId zone)
示例
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class LocalDateDemo {
public static void main(String[] args) {
LocalDate localDate = LocalDate.now();
LocalDateTime localDateTime = localDate.atStartOfDay();
System.out.println(localDateTime);
ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault());
System.out.println(zonedDateTime);
}
}
输出
2021-06-13T00:00
2021-06-13T00:00+08:00[Asia/Shanghai]
我们可以看到,时间值是一天的开始。
LocalDate isAfter(), isBefore() and isEqual() 比较日期
isAfter(ChronoLocalDate other): 检查此日期是否在给定日期之后。
isBefore(ChronoLocalDate other): 检查此日期是否在给定日期之前。
isEqual(ChronoLocalDate other): 检查此日期是否等于给定日期。
示例
import java.time.LocalDate;
public class LocalDateDemo {
public static void main(String[] args) {
LocalDate localDate1 = LocalDate.parse("2018-03-18");
LocalDate localDate2 = LocalDate.parse("2018-05-12");
System.out.println(localDate1.isAfter(localDate2));
System.out.println(localDate1.isBefore(localDate2));
System.out.println(localDate1.isEqual(localDate2));
}
}
输出
false
true
false
LocalDate isLeapYear(), isSupported() 检查闰年和输入域
isLeapYear(): 检查年份是否为闰年。
isSupported(TemporalField field): 检查是否支持给定字段。在从日期获取任何字段之前,我们可以检查该字段是否受支持,否则我们可能会出错。
isSupported(TemporalUnit unit): 检查是否支持给定的单位。在使用加减之前,我们可以检查是否支持给定的单位,否则我们可能会出错。
示例
import java.time.LocalDate;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
public class LocalDateDemo {
public static void main(String[] args) {
LocalDate localDate = LocalDate.parse("2016-03-18");
System.out.println(localDate.isLeapYear());
System.out.println(localDate.isSupported(ChronoField.DAY_OF_MONTH));
System.out.println(localDate.isSupported(ChronoUnit.HOURS));
}
}
输出
true
true
false
LocalDate lengthOfMonth(), lengthOfYear() 检查月份和年份天数最大值
lengthOfMonth(): 给出月份的最大天数,例如 28、29、30、31。
lengthOfYear(): 给出年份的最大天数 365 或 366(闰年)。
示例
import java.time.LocalDate;
public class LocalDateDemo {
public static void main(String[] args) {
LocalDate localDate = LocalDate.parse("2018-02-18");
System.out.println(localDate.lengthOfMonth());
System.out.println(localDate.lengthOfYear());
}
}
输出
28
365
LocalDate datesUntil() 返回指定时间段
Java 9
中引入了LocalDate
中的datesUntil
方法。
datesUntil
方法返回不包括给定日期的有序的日期流。
我们也可以通过 period
来设置增量步长。
我们获取从该日期开始到指定日期的日期流。
指定的日期将被排除在结果中。
dateUntil
声明如下。
Stream<LocalDate> datesUntil(LocalDate endExclusive)
Stream<LocalDate> datesUntil(LocalDate endExclusive, Period step)
示例
import java.time.LocalDate;
import java.time.Period;
import java.util.stream.Stream;
public class LocalDateDemo {
public static void main(String[] args) {
LocalDate localDate = LocalDate.parse("2018-02-18");
System.out.println("--- With LocalDate ---");
Stream<LocalDate> localDateStream = localDate.datesUntil(LocalDate.parse("2018-02-22"));
localDateStream.forEach(date -> System.out.println(date));
System.out.println("--- With LocalDate and Period ---");
localDateStream = localDate.datesUntil(LocalDate.parse("2018-02-22"), Period.ofDays(2));
localDateStream.forEach(date -> System.out.println(date));
}
}
输出
--- With LocalDate ---
2018-02-18
2018-02-19
2018-02-20
2018-02-21
--- With LocalDate and Period ---
2018-02-18
2018-02-20
LocalDate until() 计算两个日期之间的时间量
- 计算此日期和指定日期之间的时期为
Period
Period until(ChronoLocalDate endDateExclusive)
- 计算距指定日期(不包括)的时间量。
long until(Temporal endExclusive, TemporalUnit unit)
示例
import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.ChronoUnit;
public class LocalDateDemo {
public static void main(String[] args) {
LocalDate localDate = LocalDate.parse("2018-02-18");
Period period = localDate.until(LocalDate.parse("2018-03-28"));
System.out.println(period.getDays());
long val = localDate.until(LocalDate.parse("2018-03-28"), ChronoUnit.DAYS);
System.out.println(val);
}
}
输出
10
38
LocalDate compareTo() and equals() 比较日期
compareTo(ChronoLocalDate other): 将此日期与指定日期进行比较。
equals(Object obj): 检查此日期是否等于指定日期。
示例
LocalDate localDate = LocalDate.parse("2018-02-18");
System.out.println(localDate.equals(LocalDate.parse("2018-02-18")));
System.out.println(localDate.compareTo(LocalDate.parse("2018-02-25")));
输出
true
-7
LocalDate adjustInto() 复制日期
adjustInto
方法将指定的时间对象调整为与此对象具有相同的日期。
找到这个例子。
import java.time.LocalDate;
import java.time.temporal.Temporal;
public class LocalDateDemo {
public static void main(String[] args) {
LocalDate localDate = LocalDate.parse("2018-02-18");
Temporal temporalObj = LocalDate.parse("2017-03-20");
temporalObj = localDate.adjustInto(temporalObj);
System.out.println(temporalObj);
}
}
输出
2018-02-18
我们可以看到temporalObj
的日期值与localDate
不同。
但在用localDate
调整temporalObj
后,两者是一样的。
LocalDate query() 查询日期
query 方法使用指定的查询方式查询这个日期。
TemporalUnit unit = localDate.query(TemporalQueries.precision());
输出为Days
。
TemporalQueries.precision()
查询最小的支持单位。
它返回TemporalQuery
的实例。
LocalDate range() 字段有效值范围。
range 给出指定字段的有效值范围。
LocalDate localDate = LocalDate.parse("2018-02-18");
ValueRange vrange = localDate.range(ChronoField.DAY_OF_MONTH);
System.out.println(vrange);
vrange = localDate.range(ChronoField.DAY_OF_WEEK);
System.out.println(vrange);
输出
1 - 28
1 – 7
在上面的代码中,日期是“2018-02-18”
。
我们可以看到这个日期年二月的日期范围可以是 1 – 28
,星期几是 1 – 7
。
LocalDate toEpochDay() and toEpochSecond()
toEpochDay(): 将此日期转换为历法日,并返回long
值。
toEpochSecond(LocalTime time, ZoneOffset offset): 此日期转换为自1970-01-01T00:00:00Z
纪元以来的秒数,并返回long
值。在Java 9
中引入。
示例
LocalDate localDate = LocalDate.parse("2018-02-18");
System.out.println(localDate.toEpochDay());
System.out.println(localDate.toEpochSecond(LocalTime.now(), ZoneOffset.MAX));
输出
17580
1518921065