Java LocalDate类用法详解(附带实例)
日期是日常生活或程序代码中常用的信息。例如,我们想传达这样一条信息:“hey honey,我们在 1722087724174 时间点会面!”这样的时间戳表达看起来很不友好,我们希望把时间的年、月、日、时、分、秒描述出来,抑或将时间提前或延后,这使日期类变得非常复杂。
在我们的认知中,有两种时间表示:本地时间和带时区的时间。假设我们在讨论生日问题,x 年 y 月 z 日 a 点 b 分出生,往后每年 y 月 z 日举办生日派对。若考虑时区问题,可能使你在不同地区举办的派对时间提前或延后一天。为了避免这些问题,应该使用本地时间,而不要用带时区的时间。
Java 1.0 版本具有 java.util.Date 日期类,用于处理时间。事后证明,早期的时间 API 设计缺陷非常多。Java 1.1 推出 java.util.Calendar 日历类后,大部分的 Date 方法都不推荐使用了。后来,Java 8 引入 java.time.LocalDate 类,用于更好地处理时间问题。
java.util.LocalDate 是一个带年、月、日的日期对象,而 java.util.LocalDateTime 会额外附带时、分、秒信息。构建一个时间对象,可以使用静态方法 now 或 of,代码如下:
下表列出了 LocalDate 常用的方法,LocalDateTime 的方法类似。
【实例】假设当前时间为 2024-10-06,返回当前时间的后 5 天,代码如下:
若需要对时间进行调度,如计算“每月的第一个星期五”这样的日期,则可以调用 with() 并结合 TemporalAdjusters 类来使用。下表列出了一些常用的 TemporalAdjusters 类方法。java.time.Duration 类也可以用于计算两个时间点的间隔。
【实例】假设当前时间为 2024-10-06 周日,获取下周六的日期,代码如下:
Java 8 日期类默认输出格式为“2024-07-28T12:03:37.129”,若想改变日期类输出格式,则可以使用 DateTimeFormatter 对指定日期进行格式化。DateTimeFormatter 提供了常用静态标准日期格式化模板,如下表所示。ofPattern 方法也可以用于自定义格式。
DateTimeFormatter 静态标准日期模板使用示例如下:
ofPattern() 方法传入一个时间表达式,用于自定义日期格式。时间表达式规范字符,如下表所示:
自定义日期格式代码示例如下:
在我们的认知中,有两种时间表示:本地时间和带时区的时间。假设我们在讨论生日问题,x 年 y 月 z 日 a 点 b 分出生,往后每年 y 月 z 日举办生日派对。若考虑时区问题,可能使你在不同地区举办的派对时间提前或延后一天。为了避免这些问题,应该使用本地时间,而不要用带时区的时间。
Java 1.0 版本具有 java.util.Date 日期类,用于处理时间。事后证明,早期的时间 API 设计缺陷非常多。Java 1.1 推出 java.util.Calendar 日历类后,大部分的 Date 方法都不推荐使用了。后来,Java 8 引入 java.time.LocalDate 类,用于更好地处理时间问题。
java.util.LocalDate 是一个带年、月、日的日期对象,而 java.util.LocalDateTime 会额外附带时、分、秒信息。构建一个时间对象,可以使用静态方法 now 或 of,代码如下:
LocalDate now = LocalDate.now(); LocalDate localDate = LocalDate.of(2024, 7, 27); LocalDateTime nowl = LocalDateTime.now(); LocalDateTime localDateTime = LocalDateTime.of(2024, 7, 27, 22, 15, 56);
下表列出了 LocalDate 常用的方法,LocalDateTime 的方法类似。
方法 | 描述 |
---|---|
plusDays、plusWeeks、plusMonths、plusYears | 给当前时间点增加几天、几周、几个月、几年(时间延后) |
minusDays、minusWeeks、minusMonths、minusYears | 给当前时间点减少几天、几周、几个月、几年(时间提前) |
withDayOfMonth、withDayOfYear | 将月的第几天或年的第几天作为一个新 LocalDate 对象返回 |
withMonth、withYear | 将月或年修改为指定值后作为一个新 LocalDate 对象返回 |
getDayOfMonth、getDayOfYear、getDayOfWeek |
返回月份中的第几天(1~31) 返回年份中的第几天(1~366) 返回星期中的第几天(1~7) |
getMonth | 返回月份的枚举值 Month |
getMonthValue、getYear | 返回当前时间的月份、年份 |
getHour、getMinute、getSecond、getNano (LocalDateTime 类的方法) |
返回当前时间的时、分、秒、纳秒 |
【实例】假设当前时间为 2024-10-06,返回当前时间的后 5 天,代码如下:
import java.time.LocalDate; public class DateDemo { public static void main(String[] args) { LocalDate localDate = LocalDate.now().plusDays(5); System.out.println(localDate); } }程序运行结果为:
2024-10-11
在上述代码中,当前时间从 2024-10-6 返回 2024-10-11。若需要对时间进行调度,如计算“每月的第一个星期五”这样的日期,则可以调用 with() 并结合 TemporalAdjusters 类来使用。下表列出了一些常用的 TemporalAdjusters 类方法。java.time.Duration 类也可以用于计算两个时间点的间隔。
方法 | 描述 |
---|---|
next、previous | 返回下周或上周的星期日期 |
nextOrSame、previousOrSame | 返回下周或上周的星期日期,如果今天就是指定的星期,那么返回今天 |
dayOfWeekInMonth | 返回指定月份的第几个星期几 |
lastInMonth | 返回指定月份的最后一个星期几 |
firstDayOfMonth、firstDayOfNextMonth、firstDayOfYear firstDayOfNextYear、lastDayOfMonth、lastDayOfYear |
返回指定月份的第一天、下个月第一天、今年第一天、明年第一天、这个月最后一天、今年最后一天的日期 |
【实例】假设当前时间为 2024-10-06 周日,获取下周六的日期,代码如下:
import java.time.DayOfWeek; import java.time.LocalDate; import java.time.temporal.TemporalAdjusters; public class DateDemo { public static void main(String[] args) { LocalDate with = LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.SATURDAY)); System.out.println(with); } }程序运行结果为:
2024-10-12
在上述代码中,获取下周六的日期,当前时间为 2024-10-06 周日,返回的时间是 2024-10-12。Java 8 日期类默认输出格式为“2024-07-28T12:03:37.129”,若想改变日期类输出格式,则可以使用 DateTimeFormatter 对指定日期进行格式化。DateTimeFormatter 提供了常用静态标准日期格式化模板,如下表所示。ofPattern 方法也可以用于自定义格式。
格式 | 描述 |
---|---|
BASIC_ISO_DATE | 年月日+时区偏移 |
ISO_OFFSET_DATE_TIME | 年-月-日 T 时:分:秒.+时区偏移 |
ISO_ZONED_DATE_TIME | 年-月-日 T 时:分:秒.+时区偏移[时区ID] |
ISO_INSTANT | 年-月-日 T 时:分:秒.Z Z 时区 ID 表示 UTC 时间 |
ISO_DATE_TIME | 年-月-日 T 时:分:秒.+时区偏移[时区ID] 时区信息可选 |
DateTimeFormatter 静态标准日期模板使用示例如下:
// 输出 20240728+0800 DateTimeFormatter.BASIC_ISO_DATE.format(ZonedDateTime.now()); // 输出 2024-07-28T12:42:51.397+08:00 DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now()); // 输出 2024-07-28T12:42:51.397+08:00[Asia/Shanghai] DateTimeFormatter.ISO_ZONED_DATE_TIME.format(ZonedDateTime.now()); // 输出 2024-07-28T04:42:51.397Z DateTimeFormatter.ISO_INSTANT.format(ZonedDateTime.now()); // 输出 2024-07-28T12:42:51.397+08:00[Asia/Shanghai] DateTimeFormatter.ISO_DATE_TIME.format(ZonedDateTime.now());
ofPattern() 方法传入一个时间表达式,用于自定义日期格式。时间表达式规范字符,如下表所示:
符号 | 描述 |
---|---|
y | 年 |
M | 月 |
d | 日 |
H | 时 |
m | 分 |
s | 秒 |
e、E | 星期数字、星期英文缩写 |
自定义日期格式代码示例如下:
// 输出 2024-07-28 20:08:42 DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()); // 输出 2024-07-28 20:09:38 星期日 DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss E").format(LocalDateTime.now());