微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java DateTimeFormatter 月份格式

如何解决Java DateTimeFormatter 月份格式

我正在尝试将 Instant 转换为格式为“10 Jul 2021,10:00 PM”的字符串。

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”。

解决方法

使用 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 版本而异。我不希望它。

您的代码出了什么问题?

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

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

,

试试这个代码:这将 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。