如何在Java中更改时间格式 - "am/pm" vs. "AM/PM"

3

之前创建的测试使用 DateTimeFormatter.ofPattern("ha"); 并返回 "10AM" (对于 '2017-04-09T10:00-06:00[US/Mountain]' )。

在我的 MacOs 和 Java ['openjdk version "11.0.12"'] 上,我得到了 "10am"

"10AM" != "10am"

在规范中,我看到“ha”应该创建“10AM”,而不是“10am”。参见:https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html。有什么建议吗?

这取决于所使用的语言环境,最终也取决于语言环境数据以及语言环境数据提供者。例如,请参见java.text.ParseException: Unparseable date: "01:19 PM" - Ole V.V.
在你的 Mac 上,Java 的默认语言环境是什么? (System.out.println(Locale.getDefault(Locale.Category.FORMAT));) - Ole V.V.
2个回答

8

DateTimeFormatter 是一个与语言环境相关的类型,即其解析和格式化取决于 Locale。请查看 不要在没有 Locale 的情况下使用 SimpleDateFormat 或 DateTimeFormatter 以了解更多信息。

如果您使用英文 Locale,并且希望输出始终为单个大小写(即大写),则可以将字符串操作与格式化字符串链接起来,例如:

import java.time.LocalTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        System.out.println(
                LocalTime.now(ZoneOffset.UTC)
                    .format(DateTimeFormatter.ofPattern("ha", Locale.ENGLISH))
                    .toUpperCase()
        );
    }
}

一个样例运行的输出结果:

6AM

在线演示

教程:日期时间了解更多关于现代日期时间API*的内容。


* 如果您正在从事Android项目,并且您的Android API级别仍未符合Java-8标准,请查看通过解糖可用的Java 8+ API。请注意,Android 8.0 Oreo已经提供了java.time支持


1
-Duser.timezone=EDT
-Duser.country=US
-Duser.language=en-US

已解决的问题


1
我认为最后一个参数-Duser.language=en-US在这里是决定性的。你可以只使用它进行尝试,或者如果你喜欢它们,也可以保留全部三个参数。 - Ole V.V.
2
不要使用EDT作为时区。首先,它并不存在;其次,三个字母的时区缩写往往是含糊不清的。第三,没有任何地方全年都使用东部夏令时(我猜你本意是这个)。例如,使用America/New_York。在时区中始终使用region/city格式。 - Ole V.V.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接