java - 使用 SimpleDateFormat 但小时值倒退 3 小时

标签 java android date calendar

我使用 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 是一种标准做法,因此不足为奇。

无论如何,您使用的日期时间类 SimpleDateFormatCalendar 设计不佳,前者尤其麻烦。幸运的是,两者都早已过时。而是使用现代 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

链接

关于java - 使用 SimpleDateFormat 但小时值倒退 3 小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56481021/

相关文章:

java - 使用对象 java.util.Date 时得到错误的星期几

android - Jetpack Compose 中的图像裁剪器?

python - 格式化没有破折号的日期?

android ExpandableListView - NullPointerException

php - 如何将数据库中的时间戳字段格式化为荷兰语区域设置?

date - NSDate 从 Swift 2.3 到 Date 从 Swift 3 转换

java - EntityUtils.toString(entity) 抛出 OutOfMemory 错误

java - 在 Java 中实现自动完成——我做对了吗?

java - 如何从 android 市场加载 apk 依赖项?

java - 如何限制每秒的网络请求以避免垃圾邮件和拒绝服务