【问题标题】:Java DateTimeFormatter Month Of Year FormatJava DateTimeFormatter 一年中的月份格式
【发布时间】:2021-05-18 15:58:18
【问题描述】:

我正在尝试将 Instant 转换为格式为“2021 年 7 月 10 日,晚上 10:00”的字符串。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd LLL yyyy, hh:mm a");
String formattedDate = formatter.withZone(ZoneId.from(ZoneOffset.UTC)).format(instant);

它在我的机器上按预期工作,但在其他环境中显示为“10 7 2021, 10:00 PM”。

【问题讨论】:

标签: java date-formatting java-time java.time.instant datetimeformatter


【解决方案1】:

使用 MMM 作为月份缩写并指定所需的语言环境

    Instant instant = Instant.ofEpochSecond(1_625_954_400);
    DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern("dd MMM uuuu, hh:mm a", Locale.US);
    String formattedDate = formatter.withZone(ZoneOffset.UTC).format(instant);
    System.out.println(formattedDate);

输出:

2021 年 7 月 10 日晚上 10:00

这在计算机上应该是稳定的,除了理论上它可能会随着不同的 Java 版本而变化。我不希望它。

你的代码出了什么问题?

您观察到的不一致结果很可能是由于不同的语言环境造成的。如果没有其他指示,单参数 DateTimeFormatter.ofPattern() 会为您提供一个使用 JVM 的默认语言环境的格式化程序(通常取自操作系统设置)。这将在具有不同语言和区域设置的计算机和 JVM 上为您提供非常不同的结果。更令人困惑的是,语言环境数据因 Java 版本和语言环境提供程序设置(java.locale.providers 系统属性)而异。在我的 Java 8 上,很多语言环境都将 7 作为来自 LLL 的月份,而只有德语有 Jul。在我的 Java 11 上,只有利比里亚的 Vai 语言提供 7,而许多人提供 Jul

格式模式字母L 用于月份名称或缩写的独立形式,通常不应在月份是日期的一部分时使用,就像您的情况一样。在大多数语言环境中,LM 给出相同的结果,但有些语言环境存在差异并且是故意的。

【讨论】:

    【解决方案2】:

    试试这个代码:这将工作 100%

    DateFormat df = new SimpleDateFormat("dd-MMMM-yyyy HH:mm a");
        Date date = new Date(System.currentTimeMillis());
        String infi = df.format(date);
    

    输出是这样的

    2021 年 5 月 18 日晚上 11:31

    【讨论】:

    • 这与“2021 年 7 月 10 日,晚上 10:00”问题中指定的格式不匹配。
    • 一定要避免SimpleDateFormat,那是一个臭名昭著的班级麻烦制造者。 OP 明智地从 java.time 中询问DateTimeFormatter,这是现代且更优越的日期和时间 API。
    • 从你的代码中我得到了18-maj-2021 14:37 PM。我不认为 OP 想要小的 mj。我建议你从你的 100% 中减去。 :-)
    猜你喜欢
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 2017-01-27
    • 1970-01-01
    相关资源
    最近更新 更多