抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

摘要:本文学习了如何使用和格式化日期时间。

环境

Windows 10 企业版 LTSC 21H2
Java 1.8

1 说明

从JDK1.8开始,可以使用新的日期时间API来进一步加强对日期时间的处理。

在旧版的API中存在诸多问题:

  • 线程不安全,如果两个线程同时操作同一个java.util.Calendar类的对象,可能会导致不可预测的行为。
  • 设计不合理,在java.utiljava.sql的包中都有日期类,并且两个包存在类名相同的类,但是却在java.text包中定义用于格式化和解析的类。
  • 时区处理麻烦,在处理不同语言和地区的日期格式时不够灵活。

新API基于ISO标准日历系统,所有类都在java.time包下,是不可变类型而且线程安全。

2 使用

2.1 LocalDate

2.1.1 获取当前日期

新版:

java
1
2
LocalDate date = LocalDate.now();
System.out.println(date);// 2025-05-02

旧版:

java
1
2
Date date = new Date();
System.out.println(date);// Fri May 02 11:24:22 CST 2025

2.1.2 获取特定日期

新版:

java
1
2
LocalDate date = LocalDate.of(2025, 05, 02);
System.out.println(date);// 2025-05-02

旧版:

java
1
2
3
4
Calendar cal = Calendar.getInstance();
cal.set(2025, Calendar.MAY, 02);
Date date = cal.getTime();
System.out.println(date);// Fri May 02 11:25:14 CST 2025

2.1.3 日期加减操作

新版:

java
1
2
3
LocalDate date = LocalDate.now();
date = date.plusYears(1);
System.out.println(date);// 2026-05-02

旧版:

java
1
2
3
4
Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, 1);
Date date = cal.getTime();
System.out.println(date);// Sat May 02 11:26:47 CST 2026

2.2 LocalTime

2.2.1 获取当前时间

新版:

java
1
2
LocalTime time = LocalTime.now();
System.out.println(time);// 11:27:28.161

旧版:

java
1
2
3
4
5
Calendar cal = Calendar.getInstance();
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
System.out.println(hour + ":" + minute + ":" + second);// 11:28:15

2.2.2 获取特定时间

新版:

java
1
2
LocalTime time = LocalTime.of(11, 28, 59);
System.out.println(time);// 11:28:59

旧版:

java
1
2
3
4
5
6
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 11);
cal.set(Calendar.MINUTE, 28);
cal.set(Calendar.SECOND, 59);
Date time = cal.getTime();
System.out.println(time);// Fri May 02 11:28:59 CST 2025

2.2.3 时间加减操作

新版:

java
1
2
3
LocalTime time = LocalTime.now();
time = time.plusHours(1);
System.out.println(time);// 12:30:09.575

旧版:

java
1
2
3
4
Calendar cal = Calendar.getInstance();
cal.add(Calendar.HOUR, 1);
Date time = cal.getTime();
System.out.println(time);// Fri May 02 12:30:29 CST 2025

2.3 LocalDateTime

2.3.1 获取当前日期时间

新版:

java
1
2
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime);// 2025-05-02T11:31:34.928

旧版:

java
1
2
Date dateTime = new Date();
System.out.println(datdateTimee);// Fri May 02 11:32:06 CST 2025

2.3.2 获取特定日期时间

新版:

java
1
2
3
4
LocalDate date = LocalDate.of(2025, 05, 02);
LocalTime time = LocalTime.of(11, 32, 59);
LocalDateTime dateTime = LocalDateTime.of(date, time);
System.out.println(dateTime);// 2025-05-02T11:32:59

旧版:

java
1
2
3
4
5
6
7
Calendar cal = Calendar.getInstance();
cal.set(2025, Calendar.MAY, 02);
cal.set(Calendar.HOUR_OF_DAY, 11);
cal.set(Calendar.MINUTE, 32);
cal.set(Calendar.SECOND, 59);
Date dateTime = cal.getTime();
System.out.println(dateTime);// Fri May 02 11:32:59 CST 2025

2.3.3 日期时间加减操作

新版:

java
1
2
3
4
LocalDateTime dateTime = LocalDateTime.now();
dateTime = dateTime.plusMonths(1);
dateTime = dateTime.plusMinutes(1);
System.out.println(dateTime);// 2025-06-02T11:34:17.008

旧版:

java
1
2
3
4
5
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 1);
cal.add(Calendar.MINUTE, 1);
Date dateTime = cal.getTime();
System.out.println(dateTime);// Mon Jun 02 11:34:35 CST 2025

2.4 ZonedDateTime

2.4.1 获取指定时区的当前日期时间

新版:

java
1
2
3
ZoneId zoneId = ZoneId.of("Asia/Shanghai");
ZonedDateTime zonedDateTime = ZonedDateTime.now(zoneId);
System.out.println(zonedDateTime);// 2025-05-02T11:35:03.895+08:00[Asia/Shanghai]

旧版:

java
1
2
3
4
5
6
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai"));
Date dateTime = cal.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai");
sdf.setTimeZone(timeZone);
System.out.println(sdf.format(dateTime));// 2025-05-02 11:35:22 +0800

2.4.2 获取指定时区的特定日期时间

新版:

java
1
2
3
4
LocalDateTime localDateTime = LocalDateTime.of(2025, 05, 02, 11, 35, 59);
ZoneId zoneId = ZoneId.of("Asia/Shanghai");
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zoneId);
System.out.println(zonedDateTime);// 2025-05-02T11:35:59+08:00[Asia/Shanghai]

旧版:

java
1
2
3
4
5
6
7
8
9
10
11
Calendar cal = Calendar.getInstance();
cal.set(2025, Calendar.MAY, 02);
cal.set(Calendar.HOUR_OF_DAY, 11);
cal.set(Calendar.MINUTE, 35);
cal.set(Calendar.SECOND, 59);
TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai");
cal.setTimeZone(timeZone);
Date dateTime = cal.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
sdf.setTimeZone(timeZone);
System.out.println(sdf.format(dateTime));// 2025-05-02 11:35:59 +0800

3 格式化

3.1 参数说明

格式化参数说明:

字母序列 描述 示例
y 一位数或两位数的年份。 0 - 99
yy 两位数的年份。 00 - 99
yyyy 四位数的年份。 0099 2000
YYYY 四位数的年份,指本周的年份。很少用到。 0099 2000
M 一位数或两位数的月份。 1 - 12
MM 两位数的月份。 01 - 12
MMM 当前语言环境下月份的缩写。 Jan - Dec
MMMM 当前语言环境下月份的全称。 January - December
d 一个月中一位数或两位数的日期。 1 - 31
dd 一个月中两位数的日期。 01 - 31
DDD 一年中三位数的日期。 001 - 366
EEE 当前语言环境下一周中的日期缩写。 Mon - Sun
EEEE 当前语言环境下一周中的日期全称。 Monday - Sunday
a 表示AM或PM。 AM PM
h 12小时制中一位数或两位数的小时数。 1 - 12
hh 12小时制中两位数的小时数。 01 - 12
H 24小时制中一位数或两位数的小时数。 0 - 23
HH 24小时制中两位数的小时数。 00 - 23
m 一小时中一位数或两位数的分钟数。 0 - 59
mm 一小时中两位数的分钟数。 00 - 59
s 一分钟中一位数或两位数的秒数。 0 - 59
ss 一分钟中两位数的秒数。 00 - 59
S 一位数、两位数或三位数的毫秒数。 0 - 999
SSS 三位数的毫秒数。 000 - 999
z或zzz 三个字母的时区缩写。 EST CST
Z 相对于GMT的时区。 -0500

3.2 对象转字符串

新版:

java
1
2
3
LocalDateTime dateTime = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(dateTime.format(formatter));// 2025-05-02 11:36:36

旧版:

java
1
2
3
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(date));// 2025-05-02 11:37:08

3.3 字符串转对象

新版:

java
1
2
3
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse("2025-05-02 11:37:59", formatter);
System.out.println(dateTime);// 2025-05-02T11:37:59

旧版:

java
1
2
3
4
5
6
7
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date date = sdf.parse("2025-05-02 11:37:59");
System.out.println(date);// Fri May 02 11:37:59 CST 2025
} catch (ParseException e) {
e.printStackTrace();
}

4 计算间隔

4.1 计算日期间隔

示例:

java
1
2
3
4
5
6
LocalDate startDate = LocalDate.of(2024, 04, 01);
LocalDate endDate = LocalDate.of(2025, 05, 02);
Period period = Period.between(startDate, endDate);
int years = period.getYears();// 获取年份间隔
int months = period.getMonths();// 获取月份间隔
int days = period.getDays();// 获取天数间隔

4.2 计算时间间隔

示例:

java
1
2
3
4
5
LocalDate date = LocalDate.of(2025, 05, 02);
LocalDateTime startTime = LocalDateTime.of(date, LocalTime.of(23, 59, 00));
LocalDateTime endTime = LocalDateTime.of(date, LocalTime.of(23, 59, 59));
Duration duration = Duration.between(startTime, endTime);
long seconds = duration.getSeconds();// 获取秒数间隔

评论