首页 > 编程笔记 > Java笔记 阅读:5

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 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 的方法类似。

表:LocalDate 常用的方法
方法 描述
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 类也可以用于计算两个时间点的间隔。

表:TemporalAdjusters 类常用方法
方法 描述
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());

相关文章