Java 日期时间学习笔记
Java 中处理日期和时间的类是 java.time,它引入于 Java 8 中,提供了很多方便的操作。下面我们来一起学习一些常用的类和方法。
LocalDate
LocalDate
表示一个日期,例如 2023 年 6 月 2 日可以这样表示:
javaCopy CodeLocalDate date = LocalDate.of(2023, 6, 2);
我们还可以获取当前日期:
javaCopy CodeLocalDate 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 CodeLocalDateTime dateTime = LocalDateTime.of(2023, 6, 2, 22, 37, 14);
我们还可以获取当前日期时间:
javaCopy CodeLocalDateTime now = LocalDateTime.now();
方法
LocalDateTime
同时包含了 LocalDate
和 LocalTime
的方法,此处不再赘述。
ZonedDateTime
ZonedDateTime
表示一个带时区的日期和时间。例如 2023 年 6 月 2 日 22 点 37 分 14 秒在北京时间可以这样表示:
javaCopy CodeZonedDateTime zonedDateTime = ZonedDateTime.of(
2023, 6, 2, 22, 37, 14, 0,
ZoneId.of("Asia/Shanghai")
);
我们也可以获取当前带时区的日期时间:
javaCopy CodeZonedDateTime now = ZonedDateTime.now();
方法
ZonedDateTime
同样包含了 LocalDate
和 LocalTime
的方法,此处不再赘述。
Period 和 Duration
Period
表示一个时间段,例如 5 天可以这样表示:
javaCopy CodePeriod period = Period.ofDays(5);
Duration
表示一个时间间隔,例如 3 小时 30 分钟可以这样表示:
javaCopy CodeDuration duration = Duration.ofHours(3).plusMinutes(30);
它们可以用于计算两个日期之间的时间差:
javaCopy CodeLocalDate 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 CodeLocalDate date = LocalDate.of(2023, 6, 2);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
String formattedDate = date.format(formatter); // 2023年06月02日
或者将一个字符串解析为日期:
javaCopy CodeString str = "2023-06-02";
LocalDate date = LocalDate.parse(str);
实例:
javaCopy Codepublic 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