不一样的 Java 日期格式化大全

作者 : 开心源码 本文共6862个字,预计阅读时间需要18分钟 发布时间: 2022-05-12 共61人阅读

前言

在 Java 中,经常要将时间字符串转换为日期,或者者要将日期转换为时间字符串。这种操作一般都是用 java.text.SimpleDateFormat 类解决。例如要将日期转换为时间字符串,那么就用下面的代码。

 new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())

得到的结果是

2018-11-25 17:57:40

其中 “yyyy-MM-dd HH:mm:ss” 这部分叫做时间模式,是由少量固定的字符组合来指定的。java.text.SimpleDateFormat 可以根据这个模式调用 format 方法把时间对象格式化为符合模式的字符串,也可以根据这个模式调用 parse 来把一个符合模式的字符串解析为时间对象。但是一直以来,这个用法都不太系统,所以今天他的客户总结一下,希望对大家有帮助。

java.text.SimpleDateFormat 模式字符串

下表是 支持的时间模式的字符串

字符含义
G年代标志符
y
M
d
h时在上午或者下午(1~12)
H时在一天中(0~23)
m
s
S毫秒
E星期
D一年中的第几天
F一月中第几个星期几
w一年中第几个星期
W一月中第几个星期
a上午/下午标记符
k时在一天中(1~24)
K时在上午或者下午(0~11)
z时区

给出一个较完整的例子如下

System.out.println(    new SimpleDateFormat("G y-M-d Z E H:m:s:S a").format(new Date()));

输出结果为

公元 2018-11-26 +0800 星期一 18:3:42:236 下午

其中“公元”是年代,“ 2018-11-26”是格式化的年月日,“+0800” 是当前时区设置,“星期一”是星期,“17:32:11:099”是带毫秒的时间,“下午”是上下午标志。

java.text.SimpleDateFormat 模式扩展用法

上一章节的表格显示的是 java.text.SimpleDateFormat 模式的最基础的字符模式。这些模式实际上是可以有扩展的使用方法的。

字符含义
MM二位数字显示月份。位数不够前面补 0
MMM用月份名称简写显示月份,例如 Nov
MMMMM用月份名称全称显示月份,例如 November
HH二位数字显示 24 小时制的小时,位数不够前面补 0
hh二位数字显示 12 小时制的小时 ,位数不够前面补 0
mm二位数字显示分钟,位数不够前面补 0
hh二位数字显示秒 ,位数不够前面补 0
sss三位数字显毫秒,位数不够前面补 0
非字母字符例如-/*&^%()数字等,直接填充字符串位置
常量字符,在两个’符号之间的字符串会被当做常量直接显示
System.out.println(    new SimpleDateFormat("G y-MM-dd Z E HH:mm:ss:SSS a").format(new Date()));

输出结果为

公元 2018-11-26 +0800 星期一 18:24:05:052 下午
System.out.println(    new SimpleDateFormat("yyyy-MMMMM-|/)(&*^%$#@!,.-+12dd HH:mm:ss").format(new Date()));

输出结果为

2018-十一月-|/)(&*^%$#@!,.-+1226 20:15:13

假如我们要输出少量固定的含字母的字符串,则可以用下面的代码

            System.out.println(                new SimpleDateFormat("'ygc time :'G y-MM-dd Z E HH:mm:ss:SSS a")                    .format(new Date())            );

输出结果为:

ygc time :公元 2018-11-26 +0800 星期一 21:01:13:076 下午

时间格式语言设置

对于少量数据的显示,语言设置会影响她的体现。例如年代、月份、星期、上下午标识。

首先我们看看当前的 Java 支持哪些语言

            Map<String, String> languages = new LinkedHashMap<>();            for (Locale locale : Locale.getAvailableLocales()) {                languages.put(locale.getLanguage(), locale.getDisplayLanguage());            }            for (String key : languages.keySet()) {                System.out.println(key + ":" + languages.get(key));            }

得到结果

ar:阿拉伯文hr:克罗地亚文fr:法文es:西班牙文mt:马耳他文bg:保加利亚文zh:中文it:意大利文ko:朝鲜文uk:乌克兰文lv:拉托维亚文(列托)da:丹麦文vi:越南文en:英文sr:塞尔维亚文sv:瑞典文pt:葡萄牙文sk:斯洛伐克文hi:印地文ga:爱尔兰文fi:芬兰文et:爱沙尼亚文cs:捷克文el:希腊文hu:匈牙利文in:印度尼西亚文ja:日文be:白俄罗斯文is:冰岛文pl:波兰文tr:土耳其文ca:加泰罗尼亚文ms:马来文lt:立陶宛文sq:阿尔巴尼亚文de:德文ro:罗马尼亚文sl:斯洛文尼亚文ru:俄文no:挪威文th:泰文mk:马其顿文iw:希伯来文nl:荷兰文

在代码中通过指定 java.text.SimpleDateFormat 构造函数中的 java.util.Locale 对象来指定语言选项,而后用不同语言来格式化时间。
编写代码输出每种语言的时间字符串如下所示

            Map<String, String> languages = new LinkedHashMap<>();            for (Locale locale : Locale.getAvailableLocales()) {                languages.put(locale.getLanguage(), locale.getDisplayLanguage());            }            for (String key : languages.keySet()) {                if (key.length() > 0) {                    System.out.println(languages.get(key));                    System.out.println(                        new SimpleDateFormat("G y-MMMMM-dd Z E HH:mm:ss:SSS a", new Locale(key))                            .format(new Date())                    );                }            }

得到如下的结果:

阿拉伯文? 2018-??????-26 +0800 ? 20:55:37:457 ?克罗地亚文Poslije Krista 2018-studenoga-26 +0800 pon 20:55:37:463 PM法文ap. J.-C. 2018-novembre-26 +0800 lun. 20:55:37:465 PM西班牙文anno Dómini 2018-noviembre-26 +0800 lun 20:55:37:468 PM马耳他文WK 2018-Novembru-26 +0800 Tne 20:55:37:471 WN保加利亚文н.е. 2018-Ноември-26 +0800 Пн 20:55:37:474 PM中文公元 2018-十一月-26 +0800 星期一 20:55:37:484 下午意大利文dopo Cristo 2018-novembre-26 +0800 lun 20:55:37:488 PM朝鲜文?? 2018-11?-26 +0800 ? 20:55:37:491 ??乌克兰文п?сля н.е. 2018-листопада-26 +0800 пн 20:55:37:503 PM拉托维亚文(列托)mē 2018-novembris-26 +0800 P 20:55:37:505 PM丹麦文e.Kr. 2018-november-26 +0800 ma 20:55:37:508 PM越南文sau CN 2018-tháng m??i m?t-26 +0800 Th 2 20:55:37:518 CH英文AD 2018-November-26 +0800 Mon 20:55:37:520 PM塞尔维亚文н. е 2018-новембар-26 +0800 пон 20:55:37:523 PM瑞典文efter Kristus 2018-november-26 +0800 m? 20:55:37:526 em葡萄牙文d.C. 2018-Novembro-26 +0800 Seg 20:55:37:528 PM斯洛伐克文n.l. 2018-novembra-26 +0800 Po 20:55:37:530 PM印地文AD 2018-November-26 +0800 Mon 20:55:37:533 PM爱尔兰文AD 2018-Samhain-26 +0800 Luan 20:55:37:534 p.m.芬兰文jKr. 2018-marraskuuta-26 +0800 ma 20:55:37:536 ip.爱沙尼亚文m.a.j. 2018-november-26 +0800 E 20:55:37:547 PM捷克文po Kr. 2018-listopadu-26 +0800 Po 20:55:37:550 odp.希腊文AD 2018-Νοεμβρ?ου-26 +0800 Δευ 20:55:37:556 μμ匈牙利文i.u. 2018-november-26 +0800 H 20:55:37:563 DU印度尼西亚文CE 2018-November-26 +0800 Sen 20:55:37:565 PM日文西暦 2018-11月-26 +0800 月 20:55:37:569 午後白俄罗斯文н.е. 2018-л?стапада-26 +0800 пн 20:55:37:571 PM冰岛文AD 2018-nóvember-26 +0800 mán. 20:55:37:576 PM波兰文n.e. 2018-listopada-26 +0800 Pn 20:55:37:579 PM土耳其文MS 2018-Kas?m-26 +0800 Pzt 20:55:37:581 PM加泰罗尼亚文AD 2018-de novembre-26 +0800 dl. 20:55:37:583 PM马来文CE 2018-November-26 +0800 Isn 20:55:37:586 PM立陶宛文po.Kr. 2018-lapkritis-26 +0800 Pr 20:55:37:611 PM阿尔巴尼亚文n.e.r. 2018-n?ntor-26 +0800 H?n 20:55:37:613 MD德文n. Chr. 2018-November-26 +0800 Mo 20:55:37:616 PM罗马尼亚文?.d.C. 2018-noiembrie-26 +0800 L 20:55:37:618 PM斯洛文尼亚文po Kr. 2018-november-26 +0800 Pon 20:55:37:620 PM俄文н.э. 2018-ноября-26 +0800 Пн 20:55:37:622 PM挪威文AD 2018-november-26 +0800 ma 20:55:37:626 PM泰文?.?. 2018-?????????-26 +0800 ?. 20:55:37:628 ??????????马其顿文ае. 2018-ноември-26 +0800 пон. 20:55:37:630 PM希伯来文????"? 2018-??????-26 +0800 ? 20:55:37:645 PM荷兰文n. Chr. 2018-november-26 +0800 ma 20:55:37:651 PM

假如用月份简写来输出的代码如下

            Map<String, String> languages = new LinkedHashMap<>();            for (Locale locale : Locale.getAvailableLocales()) {                languages.put(locale.getLanguage(), locale.getDisplayLanguage());            }            for (String key : languages.keySet()) {                if (key.length() > 0) {                    System.out.println(languages.get(key));                    System.out.println(                        new SimpleDateFormat("G y-MMM-dd Z E HH:mm:ss:SSS a", new Locale(key))                            .format(new Date())                    );                }            }
阿拉伯文? 2018-???-26 +0800 ? 20:58:06:797 ?克罗地亚文Poslije Krista 2018-stu-26 +0800 pon 20:58:06:803 PM法文ap. J.-C. 2018-nov.-26 +0800 lun. 20:58:06:806 PM西班牙文anno Dómini 2018-nov-26 +0800 lun 20:58:06:809 PM马耳他文WK 2018-Nov-26 +0800 Tne 20:58:06:812 WN保加利亚文н.е. 2018-XI-26 +0800 Пн 20:58:06:815 PM中文公元 2018-十一月-26 +0800 星期一 20:58:06:823 下午意大利文dopo Cristo 2018-nov-26 +0800 lun 20:58:06:826 PM朝鲜文?? 2018-11?-26 +0800 ? 20:58:06:835 ??乌克兰文п?сля н.е. 2018-лист.-26 +0800 пн 20:58:06:848 PM拉托维亚文(列托)mē 2018-nov.-26 +0800 P 20:58:06:851 PM丹麦文e.Kr. 2018-nov.-26 +0800 ma 20:58:06:853 PM越南文sau CN 2018-thg 11-26 +0800 Th 2 20:58:06:864 CH英文AD 2018-Nov-26 +0800 Mon 20:58:06:865 PM塞尔维亚文н. е 2018-нов-26 +0800 пон 20:58:06:868 PM瑞典文efter Kristus 2018-nov-26 +0800 m? 20:58:06:875 em葡萄牙文d.C. 2018-nov-26 +0800 Seg 20:58:06:888 PM斯洛伐克文n.l. 2018-nov-26 +0800 Po 20:58:06:902 PM印地文AD 2018-Nov-26 +0800 Mon 20:58:06:912 PM爱尔兰文AD 2018-Samh-26 +0800 Luan 20:58:06:916 p.m.芬兰文jKr. 2018-marraskuuta-26 +0800 ma 20:58:06:920 ip.爱沙尼亚文m.a.j. 2018-nov-26 +0800 E 20:58:06:932 PM捷克文po Kr. 2018-Lis-26 +0800 Po 20:58:06:950 odp.希腊文AD 2018-Νοε-26 +0800 Δευ 20:58:06:953 μμ匈牙利文i.u. 2018-nov.-26 +0800 H 20:58:06:973 DU印度尼西亚文CE 2018-Nov-26 +0800 Sen 20:58:06:976 PM日文西暦 2018-11-26 +0800 月 20:58:06:982 午後白俄罗斯文н.е. 2018-л?с-26 +0800 пн 20:58:06:985 PM冰岛文AD 2018-nóv.-26 +0800 mán. 20:58:06:988 PM波兰文n.e. 2018-lis-26 +0800 Pn 20:58:06:991 PM土耳其文MS 2018-Kas-26 +0800 Pzt 20:58:06:998 PM加泰罗尼亚文AD 2018-de nov.-26 +0800 dl. 20:58:07:007 PM马来文CE 2018-Nov-26 +0800 Isn 20:58:07:009 PM立陶宛文po.Kr. 2018-Lap-26 +0800 Pr 20:58:07:065 PM阿尔巴尼亚文n.e.r. 2018-N?n-26 +0800 H?n 20:58:07:069 MD德文n. Chr. 2018-Nov-26 +0800 Mo 20:58:07:073 PM罗马尼亚文?.d.C. 2018-Nov-26 +0800 L 20:58:07:077 PM斯洛文尼亚文po Kr. 2018-nov.-26 +0800 Pon 20:58:07:080 PM俄文н.э. 2018-ноя-26 +0800 Пн 20:58:07:083 PM挪威文AD 2018-nov-26 +0800 ma 20:58:07:088 PM泰文?.?. 2018-?.?.-26 +0800 ?. 20:58:07:091 ??????????马其顿文ае. 2018-ноем.-26 +0800 пон. 20:58:07:094 PM希伯来文????"? 2018-???-26 +0800 ? 20:58:07:097 PM荷兰文n. Chr. 2018-nov-26 +0800 ma 20:58:07:100 PM

还有其余的少量客户,你可以继续去探究。假如觉得本文对你有用。那么请多多点赞

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 不一样的 Java 日期格式化大全

发表回复