Java 日期时间学习笔记

Java 中处理日期和时间的类是 java.time,它引入于 Java 8 中,提供了很多方便的操作。下面我们来一起学习一些常用的类和方法。

LocalDate

LocalDate 表示一个日期,例如 2023 年 6 月 2 日可以这样表示:

javaCopy Code
LocalDate date = LocalDate.of(2023, 6, 2);

我们还可以获取当前日期:

javaCopy Code
LocalDate today = LocalDate.now();

方法

javaCopy Code
// 获取年份 int year = date.getYear(); // 获取月份,返回值为 Month 枚举类型 Month month = date.getMonth(); int monthValue = date.getMonthValue(); // 获取月份的值,1-12 // 获取日 int dayOfMonth = date.getDayOfMonth(); int dayOfWeek = date.getDayOfWeek().getValue(); // 获取周几的值,1-7 int dayOfYear = date.getDayOfYear(); // 获取年中的第几天 // 判断是否为闰年 boolean leapYear = date.isLeapYear(); // 其他 LocalDate plusDays = date.plusDays(10); // 加上 10 天 LocalDate minusMonths = date.minusMonths(2); // 减去 2 个月 LocalDate withDayOfMonth = date.withDayOfMonth(1); // 将日期设置为当月的第一天

LocalDateTime

LocalDateTime 表示一个日期和时间,可以精确到纳秒。例如 2023 年 6 月 2 日 22 点 37 分 14 秒可以这样表示:

javaCopy Code
LocalDateTime dateTime = LocalDateTime.of(2023, 6, 2, 22, 37, 14);

我们还可以获取当前日期时间:

javaCopy Code
LocalDateTime now = LocalDateTime.now();

方法

LocalDateTime 同时包含了 LocalDateLocalTime 的方法,此处不再赘述。

ZonedDateTime

ZonedDateTime 表示一个带时区的日期和时间。例如 2023 年 6 月 2 日 22 点 37 分 14 秒在北京时间可以这样表示:

javaCopy Code
ZonedDateTime zonedDateTime = ZonedDateTime.of( 2023, 6, 2, 22, 37, 14, 0, ZoneId.of("Asia/Shanghai") );

我们也可以获取当前带时区的日期时间:

javaCopy Code
ZonedDateTime now = ZonedDateTime.now();

方法

ZonedDateTime 同样包含了 LocalDateLocalTime 的方法,此处不再赘述。

Period 和 Duration

Period 表示一个时间段,例如 5 天可以这样表示:

javaCopy Code
Period period = Period.ofDays(5);

Duration 表示一个时间间隔,例如 3 小时 30 分钟可以这样表示:

javaCopy Code
Duration duration = Duration.ofHours(3).plusMinutes(30);

它们可以用于计算两个日期之间的时间差:

javaCopy Code
LocalDate start = LocalDate.of(2023, 6, 1); LocalDate end = LocalDate.of(2023, 6, 7); Period period = Period.between(start, end); // 6 天 LocalDateTime startDateTime = LocalDateTime.of(2023, 6, 1, 0, 0); LocalDateTime endDateTime = LocalDateTime.of(2023, 6, 2, 22, 37, 14); Duration duration = Duration.between(startDateTime, endDateTime); // 46 小时 37 分钟 14 秒

DateTimeFormatter

DateTimeFormatter 用于格式化日期和时间。例如将一个日期格式化为字符串:

javaCopy Code
LocalDate date = LocalDate.of(2023, 6, 2); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); String formattedDate = date.format(formatter); // 2023年06月02日

或者将一个字符串解析为日期:

javaCopy Code
String str = "2023-06-02"; LocalDate date = LocalDate.parse(str);

实例:

javaCopy Code
public class DateTimeExample { public static void main(String[] args) { LocalDate date = LocalDate.of(2023, 6, 2); System.out.println("日期:" + date); LocalDateTime dateTime = LocalDateTime.of(2023, 6, 2, 22, 37, 14); System.out.println("日期时间:" + dateTime); ZonedDateTime zonedDateTime = ZonedDateTime.of( 2023, 6, 2, 22, 37, 14, 0, ZoneId.of("Asia/Shanghai") ); System.out.println("时区日期时间:" + zonedDateTime); Period period = Period.ofDays(5); System.out.println("时间段:" + period); Duration duration = Duration.ofHours(3).plusMinutes(30); System.out.println("时间间隔:" + duration); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); String formattedDate = date.format(formatter); System.out.println("格式化日期:" + formattedDate); String str = "2023-06-02"; LocalDate parsedDate = LocalDate.parse(str); System.out.println("解析日期:" + parsedDate); } }

输出结果:

Copy Code
日期:2023-06-02 日期时间:2023-06-02T22:37:14 时区日期时间:2023-06-02T22:37:14+08:00[Asia/Shanghai] 时间段:P5D 时间间隔:PT3H30M 格式化日期:2023年06月02日 解析日期:2023-06-02