我使用 SimpleDateFormat 获取当前日期和小时,日期工作正常,但由于未知原因,小时值向后 3 小时。 例如,如果我将在 19:40 运行代码,时间值将为 16:40,我不知道为什么。 非常感谢您的帮助。
String timeStamp = new SimpleDateFormat("M/d/yyyy&HH:mm").format(Calendar.getInstance().getTime());
最佳答案
java.time 和 ThreeTenABP
java.time 是现代 Java 日期和时间 API,它提供了一种非常自然的方式来控制时区。例如:
ZoneId zone = ZoneId.of("Asia/Istanbul");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/uuuu&HH:mm");
String timeStamp = ZonedDateTime.now(zone).format(formatter );
System.out.println(timeStamp);
当我刚才运行这段代码时,输出是:
6/6/2019&19:53
我不知道你所在的时区,相信你能指定正确的时区。这很重要。
问题:我可以在 Android 上使用 java.time 吗?
是的,java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6。
- 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。
- 在 Java 6 和 7 中获取 ThreeTen Backport,这是现代类的反向端口(ThreeTen for JSR 310;请参阅底部的链接)。
- 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从
org.threeten.bp
导入日期和时间类。
你的代码出了什么问题?
正如其他人所说,您的问题是时区问题。显然,您的 SimpleDateFormat
的时区设置为 UTC。当您未指定时区时,它会从 JVM 获取其时区,如果未另行指定,则 JVM 通常会从操作系统获取时区。您的 JVM 使用 UTC 是一种标准做法,因此不足为奇。
无论如何,您使用的日期时间类 SimpleDateFormat
和 Calendar
设计不佳,前者尤其麻烦。幸运的是,两者都早已过时。而是使用现代 Java 日期和时间 API java.time。
I've just noticed that the phone hour is 3 hours backwards as well. Is there a way to change it?
很可能电话系统时钟是正确的(甚至可能从时间服务器自动更新),但其时区设置为 UTC。应该有一种方法可以在手机设置中将其设置为您的时区(然后您的 JVM 也可能会使用它)。
ISO 8601
顺便说一句,您的时间戳格式很奇特。我建议您使用标准格式,最好是 ISO 8601,并且在字符串中包含偏移量,这样即使时区错误,时间仍然是明确和正确的。两个例子。首先,您可以有意识地使用 UTC:
String timeStamp = Instant.now().toString();
2019-06-06T16:57:19.493599Z
尾随 Z
表示 UTC。
如果你想要自己的时区:
String timeStamp = OffsetDateTime.now(zone).toString();
2019-06-06T19:58:29.788376+03:00
链接
- Oracle tutorial: Date Time解释如何使用 java.time。
- Java Specification Request (JSR) 310 ,其中首次描述了
java.time
。 - ThreeTen Backport project ,
java.time
到 Java 6 和 7(JSR-310 的 ThreeTen)的反向移植。 - ThreeTenABP , ThreeTen Backport 安卓版
- Question: How to use ThreeTenABP in Android Project ,并提供非常详尽的解释。
- Wikipedia article: ISO 8601
关于java - 使用 SimpleDateFormat 但小时值倒退 3 小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56481021/