摘要:本文学习了如何使用和格式化日期时间。
环境
Windows 10 企业版 LTSC 21H2
Java 1.8
1 说明
从JDK1.8开始,可以使用新的日期时间API来进一步加强对日期时间的处理。
在旧版的API中存在诸多问题:
- 线程不安全,如果两个线程同时操作同一个
java.util.Calendar
类的对象,可能会导致不可预测的行为。
- 设计不合理,在
java.util
和java.sql
的包中都有日期类,并且两个包存在类名相同的类,但是却在java.text
包中定义用于格式化和解析的类。
- 时区处理麻烦,在处理不同语言和地区的日期格式时不够灵活。
新API基于ISO标准日历系统,所有类都在java.time
包下,是不可变类型而且线程安全。
2 使用
2.1 LocalDate
2.1.1 获取当前日期
新版:
java1 2
| LocalDate date = LocalDate.now(); System.out.println(date);
|
旧版:
java1 2
| Date date = new Date(); System.out.println(date);
|
2.1.2 获取特定日期
新版:
java1 2
| LocalDate date = LocalDate.of(2025, 05, 02); System.out.println(date);
|
旧版:
java1 2 3 4
| Calendar cal = Calendar.getInstance(); cal.set(2025, Calendar.MAY, 02); Date date = cal.getTime(); System.out.println(date);
|
2.1.3 日期加减操作
新版:
java1 2 3
| LocalDate date = LocalDate.now(); date = date.plusYears(1); System.out.println(date);
|
旧版:
java1 2 3 4
| Calendar cal = Calendar.getInstance(); cal.add(Calendar.YEAR, 1); Date date = cal.getTime(); System.out.println(date);
|
2.2 LocalTime
2.2.1 获取当前时间
新版:
java1 2
| LocalTime time = LocalTime.now(); System.out.println(time);
|
旧版:
java1 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);
|
2.2.2 获取特定时间
新版:
java1 2
| LocalTime time = LocalTime.of(11, 28, 59); System.out.println(time);
|
旧版:
java1 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);
|
2.2.3 时间加减操作
新版:
java1 2 3
| LocalTime time = LocalTime.now(); time = time.plusHours(1); System.out.println(time);
|
旧版:
java1 2 3 4
| Calendar cal = Calendar.getInstance(); cal.add(Calendar.HOUR, 1); Date time = cal.getTime(); System.out.println(time);
|
2.3 LocalDateTime
2.3.1 获取当前日期时间
新版:
java1 2
| LocalDateTime dateTime = LocalDateTime.now(); System.out.println(dateTime);
|
旧版:
java1 2
| Date dateTime = new Date(); System.out.println(datdateTimee);
|
2.3.2 获取特定日期时间
新版:
java1 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);
|
旧版:
java1 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);
|
2.3.3 日期时间加减操作
新版:
java1 2 3 4
| LocalDateTime dateTime = LocalDateTime.now(); dateTime = dateTime.plusMonths(1); dateTime = dateTime.plusMinutes(1); System.out.println(dateTime);
|
旧版:
java1 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);
|
2.4 ZonedDateTime
2.4.1 获取指定时区的当前日期时间
新版:
java1 2 3
| ZoneId zoneId = ZoneId.of("Asia/Shanghai"); ZonedDateTime zonedDateTime = ZonedDateTime.now(zoneId); System.out.println(zonedDateTime);
|
旧版:
java1 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));
|
2.4.2 获取指定时区的特定日期时间
新版:
java1 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);
|
旧版:
java1 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));
|
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 对象转字符串
新版:
java1 2 3
| LocalDateTime dateTime = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); System.out.println(dateTime.format(formatter));
|
旧版:
java1 2 3
| Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(date));
|
3.3 字符串转对象
新版:
java1 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);
|
旧版:
java1 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); } catch (ParseException e) { e.printStackTrace(); }
|
4 计算间隔
4.1 计算日期间隔
示例:
java1 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 计算时间间隔
示例:
java1 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();
|
条