Java中DateTimeFormatter的使用方法和案例
?简介
在Java中,DateTimeFormatter类用于格式化和解析日期时间对象。它是日期时间格式化的强大而灵活的工具。
?作用
?1.本地化时间
本地化时间指根据指定的语言环境显示时间
1.1.创建DateTimeFormatter时指定Locale
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.CHINA);
1.2.使用该DateTimeFormatter格式化日期时间
LocalDate date = LocalDate.now();
String cnDate = date.format(formatter);
这样就可以得到适合中国需求的日期格式"2021-10-01"。
1.3.可以通过Locale.US、Locale.UK等地区,从而得到不同格式
DateTimeFormatter usFormatter = DateTimeFormatter.ofPattern("MM/dd/yyyy", Locale.US);
DateTimeFormatter ukFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy", Locale.UK);
LocalDate date = LocalDate.now();
String usDate = date.format(usFormatter); // 10/01/2021
String ukDate = date.format(ukFormatter); // 01/10/2021
1.4.使用预定义的格式化常量指定地区
LocalDate date = LocalDate.now();
String cnDate = date.format(FormatStyle.LONG, Locale.CHINA);
String frDate = date.format(FormatStyle.FULL, Locale.FRANCE);
?2.ISO/RFC规范格式
ISO和RFC定义了标准的日期时间格式,可以直接使用:
LocalDate date = LocalDate.now();
// ISO格式
String isoDate = date.format(ISO_LOCAL_DATE);
// RFC格式
String rfcDate = date.format(RFC_1123_DATE_TIME);
格式名称 | 描述 | 格式 | 示例 |
---|---|---|---|
BASIC_ISO_DATE | 基本ISO日期 | yyyyMMdd | 20111203 |
ISO_LOCAL_DATE | ISO本地化日期 | yyyy-MM-dd | 2011-12-03 |
ISO_OFFSET_DATE | 带偏移时区的ISO日期 | yyyy-MM-ddXX | 2011-12-03+01:00 |
ISO_DATE | ISO 日期,可能带偏移量 | yyyy-MM-dd 或者 yyyy-MM-ddXX | 2011-12-03+01:00’;2011-12-03 |
ISO_LOCAL_TIME | ISO本地化时间 | HH:mm:ss | 10:15:30 |
ISO_OFFSET_TIME | 带偏移时区的ISO时间 | HH:mm:ssXX | 10:15:30+01:00 |
ISO_TIME | ISO时间,可能带偏移量 | HH:mm:ss 或者 HH:mm:ssXX | 10:15:30+01:00;10:15:30 |
ISO_LOCAL_DATE_TIME | ISO本地日期和时间 | yyyy-MM-dd’T’HH:mm:ss | 2011-12-03T10:15:30 |
ISO_OFFSET_DATE_TIME | 带偏移时区的ISO日期 | yyyy-MM-dd’T’HH:mm:ssXX | 2011-12-03T10:15:30+01:00 |
ISO_ZONED_DATE_TIME | 带时区的ISO日期和时间 | yyyy-MM-dd’T’HH:mm:ssZZZZ | 2011-12-03T10:15:30+01:00 |
ISO_DATE_TIME | 带Zoneld的ISO日期和时间 | yyyy-MM-dd’T’HH:mm:ssxxx | 2011-12-03T10:15:30+01:00 |
ISO_ORDINAL_DATE | 年份和一年的第N天 | yyyy-DDD | 2012-337 |
ISO_WEEK_DATE | 年份-第N周-周N | xxxx-'W’ww-e | 2012-W48-6 |
ISO_INSTANT | ISO时刻 | 2011-12-03T10:15:30Z | |
RFC_1123_DATE_TIME | RFC 1123/RFC 822 | Tue, 3 Jun 2008 11:05:30 GMT |
?3.范式格式化
常见格式化:
年份:
-
YYYY
:4位数字表示的年份,例如:2023 -
yyyy
:4位数字表示的年份,例如:2023 -
YY
:2位数字表示的年份,例如:23
月份:
-
MM
:2位数字表示的月份,例如:01表示一月,12表示十二月 -
MMM
:缩写形式的月份,例如:Jan表示一月,Dec表示十二月 -
MMMM
:完整形式的月份,例如:January表示一月,December表示十二月
日:
-
DD
dd
:2位数字表示的日期,例如:01表示1号,31表示31号
星期几:
-
ddd
:缩写形式的星期几,例如:Mon表示星期一,Sun表示星期日 -
dddd
:完整形式的星期几,例如:Monday表示星期一,Sunday表示星期日
时间:
-
HH
:24小时制的小时,例如:00表示午夜12点,23表示晚上11点 -
hh
:12小时制的小时,例如:01表示上午1点,12表示下午12点 -
mm
:分钟,例如:00表示整点,30表示30分钟 -
ss
:秒,例如:00表示整分,59表示59秒 -
a
:上午/下午标识,例如:AM表示上午,PM表示下午
参数列表整理:
符号 | 含义 | 示例 |
---|---|---|
G | 显示纪元文本 | AD(公元) |
u | 年份 | 2023 |
У | 公元年份 | 2023 |
D | 一年的第N天 | 300 |
M或者L | 月份 | 7;07; Jul; July; |
d | 一个月的第N目 | 9 |
Q或者q | 年份中的季度 | 2; 02; Q2; 2rd quarter |
Y | 以周为基础的年份 | 1997;97 |
w | 以周为基础的年份中的周 | 30 |
W | 一个月的第N周 | 3 |
E | 星期 | Tue; Tuesday; T |
e或者c | 本地化星期 | 2; 02; Tue; Tuesday; T |
F | 一个月的第N周 | 2 |
a | 一天中的上午(am)或者下午(pm) | PM |
h | 上午下午12小时制(1-12) | 10 |
K | 上午下午11小时制(1-11) | 1 |
k | 上午下午(1-24) | 14 |
H | 小时制(0-23) | 1 |
m | 小时中的分钟 | 30 |
s | 分秒 | 43 |
S | 当前秒的毫秒 | 800 |
A | 当前天的毫秒数 | 1111 |
n | 当前秒的纳秒数 | 987654321 |
N | 当前天的纳秒数 | 1234000000 |
V | 时区ID | America/Los_Angeles; Z; -08:30 |
z | 时区名称 | Pacific Standard Time; PST |
O | 本地化时区漂移 | GMT+8; GM T+08:00; UTC-08:00 |
X | offset-X | Z; -08; -0830; -08:30; -083015; -08:30:15 |
x | offset-x | +0000; -08; -0830; -08:30; -083015; -08:30:15 |
Z | offset-Z | +0000; -0800; -08:00; |
p | pad modifier | 1 |
’ | 分隔符 | |
‘’ | 不被解析的文字 | |
[ | 可选部分开始 | |
] | 可选部分结束 |
示例:
String pattern = "G uuuu'年'MMMd'日' ZZZZZ VV";
String format= DateTimeFormatter.ofPattern(pattern).format(ZonedDateTime.now());
System.out.println(format);
格式化结果显示:
公元 2023年10月01日 +08:00 Asia/hangzhou
范式格式化还提供了一些常用的格式化模式:
LocalDateTime dt = LocalDateTime.now();
// SHORT范式格式化
String shortDt = dt.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT));
// MEDIUM范式格式化
String mediumDt = dt.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM));