🔔简介
在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位数字表示的年份,例如:2023yyyy:4位数字表示的年份,例如:2023YY:2位数字表示的年份,例如:23
月份:
MM:2位数字表示的月份,例如:01表示一月,12表示十二月MMM:缩写形式的月份,例如:Jan表示一月,Dec表示十二月MMMM:完整形式的月份,例如:January表示一月,December表示十二月
日:
DDdd: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)); 
 







![web:[RoarCTF 2019]Easy Calc](https://img-blog.csdnimg.cn/ff66f1b7cdac4bfa99a9784d7e716a68.png)











