与众不同的 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

还有其他的一些用法,大家可以继续去探索。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java日期格式化SimpleDateFormat的使用详解

    日期和时间格式由 日期和时间模式字符串 指定.在 日期和时间模式字符串 中,未加引号的字母 'A' 到 'Z' 和 'a' 到 'z' 被解释为模式字母,用来表示日期或时间字符串元素.文本可以使用单引号 (') 引起来,以免进行解释.所有其他字符均不解释:只是在格式化时将它们简单复制到输出字符串 白话文的讲:这些A--Z,a--z这些字母(不被单引号包围的)会被特殊处理替换为对应的日期时间,其他的字符串还是原样输出. 日期和时间模式(注意大小写,代表的含义是不同的) yyyy:年 MM:月 dd

  • java正则实现各种日期格式化

    java正则实现各种日期格式化 package com.st.test; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.regex.Pattern; public class DateFormatUtil { @SuppressWarnings("finally") publ

  • Java使用DateFormatter格式化日期时间的方法示例

    本文实例讲述了Java使用DateFormatter格式化日期时间的方法.分享给大家供大家参考,具体如下: Java版本:1.8开始 import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; /** * Created by Fra

  • Java中SimpleDateFormat日期格式转换详解及代码示例

    SimpleDateFormat是处理日期格式转换的类. 官方API_1.8关于SimpleDateFormat继承于DateFormate截图: SimpleDateFormat的构造器如下: SimpleDateFormat中的格式定义,常用的用红色框圈出: 中文解释: y : 年 M : 年中的月份 D : 年中的天数 d : 月中的天数 w : 年中的周数 W : 月中的周数 a : 上下/下午 H : 一天中的小时数(0-23) h : 一天中的小时数(0-12) m : 小时中的分钟

  • Java日期时间格式化操作DateUtils 的整理

    Java日期时间格式化操作DateUtils 的整理 直接上代码,总结了开发过程中经常用到的日期时间格式化操作! import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.concurrent.TimeUnit; /** * ClassName: DateUtils <br/> * D

  • Java 日期格式加上指定月数(一个期限)得到一个新日期的实现代码

    下面一段实例代码给大家介绍java日期格式加上指定月数得到一个新日期,具体代码如下所示: public static Date getnewDate(Date olddate, String recordDate) throws ParseException { Date date = olddate; SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); String data = format.format(da

  • 与众不同的 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日期格式化YYYY-MM-dd遇坑指南小结

    前几天写日期格式化工具类,自己做测试的时候,无意中发现一个问题,如果把format参数设置成YYYY-MM-DD,输出的结果很奇怪. Date result1 = string2Date("2016-12-15", "yyyy-MM-dd"); System.out.println(result1); Date result2 = string2Date("2016-12-15", "YYYY-MM-DD"); System.

  • Golang中使用Date进行日期格式化(沿用Java风格)

    本文介绍了Golang中使用Date进行日期格式化,分享给大家,具体如下: Github https://github.com/noogo/date Date Date是一个基于time包装的一个日期包,通过此包可以快速创建日期.获取时间戳.毫秒数及最重要的日期格式化,另外你还可以继续使用time包下的所有函数(除time.Foramt(string)外)你可以通过以下方法快速创建一个Date对象: Now() WithTime(t time.Time) WithTimestamp(timest

  • java中日期格式化的大坑

    前言 我们都知道在java中进行日期格式化使用simpledateformat.通过格式 yyyy-MM-dd 等来进行格式化,但是你知道其中微小的坑吗? yyyy 和 YYYY 示例代码 @Test public void testWeekBasedYear() { Calendar calendar = Calendar.getInstance(); // 2019-12-31 calendar.set(2019, Calendar.DECEMBER, 31); Date strDate1

  • Java中日期格式化YYYY-DD的操作bug

    写这篇博文是记录下跨年的bug.去年隔壁组的小伙伴就是计算两个日期之间间隔的天数,因为跨年的原因计算有误. 当时测试组的小姐姐也没有模拟出来这种场景,导致上生产环境直接影响线上的数据. 今天逛技术论论坛正好遇到Java日期的操作bug. 1 yyyy 和 YYYY 别看字,看代码 @Test public void testWeekBasedYear() { Calendar calendar = Calendar.getInstance(); // 2019-12-31 calendar.se

  • java日期时间格式化@JsonFormat与@DateTimeFormat的使用

    如果要使用 @JsonFormat 这个注解的话,需要在项目中添加 jackson 相关的依赖包; 因为 @JsonFormat 注解不是 Spring 自带的注解,所以使用该注解前需要添加 jackson 相关的依赖包.当然,如果是 SpringBoot 项目就不需要自己手动添加依赖了,因为在 spring-boot-start-web 下已经包含了 jackson 相关依赖. <!-- https://mvnrepository.com/artifact/com.fasterxml.jack

  • Java日期时间以及日期相互转换

    Java日期时间,以及相互转化,供大家参考,具体内容如下 package com.study.string; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; public class DateBase { public static voi

  • JAVA字符串格式化-String.format()的使用

    本篇介绍JAVA字符串格式化-String.format()的使用,具体如下: 常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重载形式. format(String format, Object... args) 新字符串使用本地语言环境,制定字符串格式和参数生成格式化的新字符串. format(Locale locale, String for

随机推荐