与众不同的 Java 日期格式化大全
前言
在 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
还有其他的一些用法,大家可以继续去探索。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 更快的方式实现 PHP 数组去重