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