美文网首页程序员
不一样的 Java 日期格式化大全

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

作者: 阿土伯已经不是我 | 来源:发表于2018-11-26 21:02 被阅读24次

    前言

    在 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
    

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

    如果觉得本文对你有用。那么请多多点赞

    相关文章

      网友评论

        本文标题:不一样的 Java 日期格式化大全

        本文链接:https://www.haomeiwen.com/subject/pfopqqtx.html