背景
今天解析了一个不常见的日期格式 「10-Mar-2025 16:30:47.869
」,对应的 Java 日期格式是 dd-MMM-yyyy HH:mm:ss.SSS
,而且跟 Local
语言环境有关。
本文记录这个简单的解析过程,顺便回忆一下日期格式各个字段。毕竟平时只用了常见的 yyyyMMddHHmmss
这种。最重要的一点,日期字符串的格式化和解析类跟 Local 语言环境有关。
日期字段说明
关于日期的各个字段说明如下
字段 | 说明 | 示例 |
---|---|---|
G | 公元时代 | 英文环境:AD;中文环境:公元 |
yy | 年份的后2位 | 25 |
yyyy | 完整年份 | 2025 |
MM | 月份,显示为 1-12 ,不足两位的前面补 0 | 04 |
MMM | 月份简写 | 英文环境:Apr ;中文环境:4月 |
MMMM | 月份全称 | 英文环境:April;中文环境: 四月 |
dd | 日,2 位数表示,不足两位前面补 0 | 02 |
d | 日,1-2 位显示 | 2 |
EEE | 简写星期几 | 英文环境:Thu;中文环境: 周四 |
EEEE | 全写星期几 | 英文环境:Thursday;中文环境: 星期四 |
aa | 上下午 | 英文环境:AM 或 PM;中文环境:上午或下午 |
H | 小时,24小时制 | 7 |
HH | 小时,24小时制,不足两位前面补 0 | 07 |
h | 小时,12小时制 | 7 |
hh | 小时,12小时制,不足两位前面补 0 | 07 |
m | 分,1-2位 | 1 |
mm | 分,2位,不足两位前面补 0 | 01 |
s | 秒,1-2位 | 1 |
ss | 秒,2位,不足两位前面补 0 | 01 |
S | 毫秒 | 302 |
Z | GMT(时区) | +0800 |
测试
根据上面的全部的日期字段,设置两种包含内容最全的格式:
- 全写:
G yyyy-MMMM-dd HH:mm:ss.SSS EEEE aa Z
- 简写:
G yy-MMM-d H:m:s.SSS EEE aa Z
编写代码,使用这两种格式打印当前时间:
java
String fullPattern = "G yyyy-MMMM-dd HH:mm:ss.SSS EEEE aa Z";
String simplePattern = "G yy-MMM-d H:m:s.SSS EEE aa Z";
SimpleDateFormat format1 = new SimpleDateFormat(fullPattern);
SimpleDateFormat format2 = new SimpleDateFormat(simplePattern);
System.out.println("中文环境下");
System.out.println("完整 G yyyy-MMMM-dd HH:mm:ss.SSS EEEE aa Z 的结果:"+format1.format(new Date()));
System.out.println("简写 G yy-MMM-d H:m:s.SSS EEE aa Z 的结果:"+format2.format(new Date()));
System.out.println("英文环境下");
Locale.setDefault(Locale.ENGLISH);
SimpleDateFormat formatEn = new SimpleDateFormat(fullPattern);
SimpleDateFormat formatEn2 = new SimpleDateFormat(simplePattern);
System.out.println("完整 G yyyy-MMMM-dd HH:mm:ss.SSS EEEE aa Z 的结果:"+formatEn.format(new Date()));
System.out.println("简写 G yy-MMM-d H:m:s.SSS EEE aa Z 的结果:"+formatEn2.format(new Date()));
String time = "24-Mar-2025 21:10:31.791";
SimpleDateFormat parseFormat = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss.SSS", Locale.ENGLISH);
try {
Date t = parseFormat.parse(time);
System.out.println("解析结果:"+t);
} catch (ParseException e) {
throw new RuntimeException(e);
}
运行结果:
启示录
详细的看了看各个字段的含义,还是挺有启发的,尤其是星期和月份的缩写和全写在中文环境下的细微区别。全写的星期和月份用于更正式的语言环境下,月份的全称是汉字数字大写形式。
一招鲜的技术说好吧也好,不好吧,也太寡闻了,除了常用的9个字段,其他基本没有听过。还有一个疑惑,为什么星期的字段名称用了 E 而不是 W 呢,星期的英文不是 Week 么?