您的位置:首页 > 其它

使用SimpleDateFormat顺利解析日期

2010-09-28 15:17 483 查看
解析日期时经常遇到无法解析的异常

java.text.ParseException: Unparseable date: "Fri, 02-Jan-2020 00:00:00 GMT"

解析日期的要点:

1. 对照下表与解析目标字符串写出对应pattern

字母日期或时间元素表示示例
G
Era 标志符Text
AD
y
Year
1996
;
96
M
年中的月份Month
July
;
Jul
;
07
w
年中的周数Number
27
W
月份中的周数Number
2
D
年中的天数Number
189
d
月份中的天数Number
10
F
月份中的星期Number
2
E
星期中的天数Text
Tuesday
;
Tue
a
Am/pm 标记Text
PM
H
一天中的小时数(0-23)Number
0
k
一天中的小时数(1-24)Number
24
K
am/pm 中的小时数(0-11)Number
0
h
am/pm 中的小时数(1-12)Number
12
m
小时中的分钟数Number
30
s
分钟中的秒数Number
55
S
毫秒数Number
978
z
时区General time zone
Pacific Standard Time
;
PST
;
GMT-08:00
Z
时区RFC 822 time zone
-0800
这里的目标字符串就是"Fri, 02-Jan-2020 00:00:00 GMT"

写出的pattern = "EEE, dd-MMM-yyyy HH:mm:ss z"

2. 使用SimpleDateFormat进行解析

String dateStr = "Fri, 02-Jan-2020 00:00:00 GMT";
String pattern = "EEE, dd-MMM-yyyy HH:mm:ss z";
DateFormat format = new SimpleDateFormat(pattern);
log.info(format.parse(dateStr));


悲剧还是发生了

java.text.ParseException: Unparseable date: "Fri, 02-Jan-2020 00:00:00 GMT"

at java.text.DateFormat.parse(DateFormat.java:337)

...

随后做了一个实验,使用这个pattern对一个date对象进行format查看结果

Date d = new Date();
DateFormat format  = new SimpleDateFormat("EEE, dd-MMM-yyyy HH:mm:ss z");
log.info(format.format(d));


输出结果:星期二, 28-九月-2010 15:12:05 CST

恍然大悟,看来还要设置正确的Locale才可以

翻阅api查到SimpleDateFormat中还有一个重载的构造

SimpleDateFormat(String pattern, Locale locale)

用给定的模式和给定语言环境的默认日期格式符号构造
SimpleDateFormat


改良一下之前的代码就可以顺利解析了

String dateStr = "Fri, 02-Jan-2020 00:00:00 GMT";
String pattern = "EEE, dd-MMM-yyyy HH:mm:ss z";
DateFormat format = new SimpleDateFormat(pattern, Locale.US);
log.info(format.parse(dateStr));
log.info(format);


输出结果:Thu Jan 02 08:00:00 CST 2020

以此类推,其他的格式也都可以这么解析,关键就在于pattern一定要正确,还要设置正确的Locale
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: