与众不同的 Java 日期格式化大全
前言
在Java中,经常要将时间字符串转换为日期,或者要将日期转换为时间字符串。这种操作一般都是用java.text.SimpleDateFormat类处理。例如要将日期转换为时间字符串,那么就用下面的代码。
newSimpleDateFormat("yyyy-MM-ddHH:mm:ss").format(newDate())
得到的结果是
2018-11-2517:57:40
其中"yyyy-MM-ddHH: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( newSimpleDateFormat("Gy-M-dZEH:m:s:Sa").format(newDate()) );
输出结果为
公元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( newSimpleDateFormat("Gy-MM-ddZEHH:mm:ss:SSSa").format(newDate()) );
输出结果为
公元2018-11-26+0800星期一18:24:05:052下午
System.out.println( newSimpleDateFormat("yyyy-MMMMM-|/)(&*^%$#@!,.-+12ddHH:mm:ss").format(newDate()) );
输出结果为
2018-十一月-|/)(&*^%$#@!,.-+122620:15:13
如果我们要输出一些固定的含字母的字符串,则可以用下面的代码
System.out.println( newSimpleDateFormat("'ygctime:'Gy-MM-ddZEHH:mm:ss:SSSa") .format(newDate()) );
输出结果为:
ygctime:公元2018-11-26+0800星期一21:01:13:076下午
时间格式语言设置
对于一些数据的显示,语言设置会影响她的表现。例如年代、月份、星期、上下午标识。
首先我们看看当前的Java支持哪些语言
Maplanguages=newLinkedHashMap<>(); for(Localelocale:Locale.getAvailableLocales()){ languages.put(locale.getLanguage(),locale.getDisplayLanguage()); } for(Stringkey: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对象来指定语言选项,然后用不同语言来格式化时间。
编写代码输出每种语言的时间字符串如下所示
Maplanguages=newLinkedHashMap<>(); for(Localelocale:Locale.getAvailableLocales()){ languages.put(locale.getLanguage(),locale.getDisplayLanguage()); } for(Stringkey:languages.keySet()){ if(key.length()>0){ System.out.println(languages.get(key)); System.out.println( newSimpleDateFormat("Gy-MMMMM-ddZEHH:mm:ss:SSSa",newLocale(key)) .format(newDate()) ); } }
得到如下的结果:
阿拉伯文 م2018-نوفمبر-26+0800ن20:55:37:457م 克罗地亚文 PoslijeKrista2018-studenoga-26+0800pon20:55:37:463PM 法文 ap.J.-C.2018-novembre-26+0800lun.20:55:37:465PM 西班牙文 annoDómini2018-noviembre-26+0800lun20:55:37:468PM 马耳他文 WK2018-Novembru-26+0800Tne20:55:37:471WN 保加利亚文 н.е.2018-Ноември-26+0800Пн20:55:37:474PM 中文 公元2018-十一月-26+0800星期一20:55:37:484下午 意大利文 dopoCristo2018-novembre-26+0800lun20:55:37:488PM 朝鲜文 서기2018-11월-26+0800월20:55:37:491오후 乌克兰文 післян.е.2018-листопада-26+0800пн20:55:37:503PM 拉托维亚文(列托) mē2018-novembris-26+0800P20:55:37:505PM 丹麦文 e.Kr.2018-november-26+0800ma20:55:37:508PM 越南文 sauCN2018-thángmườimột-26+0800Th220:55:37:518CH 英文 AD2018-November-26+0800Mon20:55:37:520PM 塞尔维亚文 н.е2018-новембар-26+0800пон20:55:37:523PM 瑞典文 efterKristus2018-november-26+0800må20:55:37:526em 葡萄牙文 d.C.2018-Novembro-26+0800Seg20:55:37:528PM 斯洛伐克文 n.l.2018-novembra-26+0800Po20:55:37:530PM 印地文 AD2018-November-26+0800Mon20:55:37:533PM 爱尔兰文 AD2018-Samhain-26+0800Luan20:55:37:534p.m. 芬兰文 jKr.2018-marraskuuta-26+0800ma20:55:37:536ip. 爱沙尼亚文 m.a.j.2018-november-26+0800E20:55:37:547PM 捷克文 poKr.2018-listopadu-26+0800Po20:55:37:550odp. 希腊文 AD2018-Νοεμβρίου-26+0800Δευ20:55:37:556μμ 匈牙利文 i.u.2018-november-26+0800H20:55:37:563DU 印度尼西亚文 CE2018-November-26+0800Sen20:55:37:565PM 日文 西暦2018-11月-26+0800月20:55:37:569午後 白俄罗斯文 н.е.2018-лістапада-26+0800пн20:55:37:571PM 冰岛文 AD2018-nóvember-26+0800mán.20:55:37:576PM 波兰文 n.e.2018-listopada-26+0800Pn20:55:37:579PM 土耳其文 MS2018-Kasım-26+0800Pzt20:55:37:581PM 加泰罗尼亚文 AD2018-denovembre-26+0800dl.20:55:37:583PM 马来文 CE2018-November-26+0800Isn20:55:37:586PM 立陶宛文 po.Kr.2018-lapkritis-26+0800Pr20:55:37:611PM 阿尔巴尼亚文 n.e.r.2018-nëntor-26+0800Hën20:55:37:613MD 德文 n.Chr.2018-November-26+0800Mo20:55:37:616PM 罗马尼亚文 î.d.C.2018-noiembrie-26+0800L20:55:37:618PM 斯洛文尼亚文 poKr.2018-november-26+0800Pon20:55:37:620PM 俄文 н.э.2018-ноября-26+0800Пн20:55:37:622PM 挪威文 AD2018-november-26+0800ma20:55:37:626PM 泰文 ค.ศ.2018-พฤศจิกายน-26+0800จ.20:55:37:628หลังเที่ยง 马其顿文 ае.2018-ноември-26+0800пон.20:55:37:630PM 希伯来文 לפסה"נ2018-נובמבר-26+0800ב20:55:37:645PM 荷兰文 n.Chr.2018-november-26+0800ma20:55:37:651PM
如果用月份简写来输出的代码如下
Maplanguages=newLinkedHashMap<>(); for(Localelocale:Locale.getAvailableLocales()){ languages.put(locale.getLanguage(),locale.getDisplayLanguage()); } for(Stringkey:languages.keySet()){ if(key.length()>0){ System.out.println(languages.get(key)); System.out.println( newSimpleDateFormat("Gy-MMM-ddZEHH:mm:ss:SSSa",newLocale(key)) .format(newDate()) ); } }
阿拉伯文 م2018-نوف-26+0800ن20:58:06:797م 克罗地亚文 PoslijeKrista2018-stu-26+0800pon20:58:06:803PM 法文 ap.J.-C.2018-nov.-26+0800lun.20:58:06:806PM 西班牙文 annoDómini2018-nov-26+0800lun20:58:06:809PM 马耳他文 WK2018-Nov-26+0800Tne20:58:06:812WN 保加利亚文 н.е.2018-XI-26+0800Пн20:58:06:815PM 中文 公元2018-十一月-26+0800星期一20:58:06:823下午 意大利文 dopoCristo2018-nov-26+0800lun20:58:06:826PM 朝鲜文 서기2018-11월-26+0800월20:58:06:835오후 乌克兰文 післян.е.2018-лист.-26+0800пн20:58:06:848PM 拉托维亚文(列托) mē2018-nov.-26+0800P20:58:06:851PM 丹麦文 e.Kr.2018-nov.-26+0800ma20:58:06:853PM 越南文 sauCN2018-thg11-26+0800Th220:58:06:864CH 英文 AD2018-Nov-26+0800Mon20:58:06:865PM 塞尔维亚文 н.е2018-нов-26+0800пон20:58:06:868PM 瑞典文 efterKristus2018-nov-26+0800må20:58:06:875em 葡萄牙文 d.C.2018-nov-26+0800Seg20:58:06:888PM 斯洛伐克文 n.l.2018-nov-26+0800Po20:58:06:902PM 印地文 AD2018-Nov-26+0800Mon20:58:06:912PM 爱尔兰文 AD2018-Samh-26+0800Luan20:58:06:916p.m. 芬兰文 jKr.2018-marraskuuta-26+0800ma20:58:06:920ip. 爱沙尼亚文 m.a.j.2018-nov-26+0800E20:58:06:932PM 捷克文 poKr.2018-Lis-26+0800Po20:58:06:950odp. 希腊文 AD2018-Νοε-26+0800Δευ20:58:06:953μμ 匈牙利文 i.u.2018-nov.-26+0800H20:58:06:973DU 印度尼西亚文 CE2018-Nov-26+0800Sen20:58:06:976PM 日文 西暦2018-11-26+0800月20:58:06:982午後 白俄罗斯文 н.е.2018-ліс-26+0800пн20:58:06:985PM 冰岛文 AD2018-nóv.-26+0800mán.20:58:06:988PM 波兰文 n.e.2018-lis-26+0800Pn20:58:06:991PM 土耳其文 MS2018-Kas-26+0800Pzt20:58:06:998PM 加泰罗尼亚文 AD2018-denov.-26+0800dl.20:58:07:007PM 马来文 CE2018-Nov-26+0800Isn20:58:07:009PM 立陶宛文 po.Kr.2018-Lap-26+0800Pr20:58:07:065PM 阿尔巴尼亚文 n.e.r.2018-Nën-26+0800Hën20:58:07:069MD 德文 n.Chr.2018-Nov-26+0800Mo20:58:07:073PM 罗马尼亚文 î.d.C.2018-Nov-26+0800L20:58:07:077PM 斯洛文尼亚文 poKr.2018-nov.-26+0800Pon20:58:07:080PM 俄文 н.э.2018-ноя-26+0800Пн20:58:07:083PM 挪威文 AD2018-nov-26+0800ma20:58:07:088PM 泰文 ค.ศ.2018-พ.ย.-26+0800จ.20:58:07:091หลังเที่ยง 马其顿文 ае.2018-ноем.-26+0800пон.20:58:07:094PM 希伯来文 לפסה"נ2018-נוב-26+0800ב20:58:07:097PM 荷兰文 n.Chr.2018-nov-26+0800ma20:58:07:100PM
还有其他的一些用法,大家可以继续去探索。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。