使用SimpleDateFormat,但小时值倒退3小时

时间:2019-06-06 15:44:30

标签: java android date calendar

我使用SimpleDateFormat获取当前日期和小时,该日期运行良好,但由于未知原因,小时值倒退了3小时。 例如,如果我将在19:40运行代码,则时间值为16:40,而我不知道为什么。 非常感谢您的帮助。

TypeError

2 个答案:

答案 0 :(得分:1)

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反向端口,这是现代类的反向端口(JSR 310的ThreeTen;请参见底部的链接)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保您使用子包从org.threeten.bp导入日期和时间类。

您的代码出了什么问题?

正如其他人所说,您的问题是时区问题。显然您的SimpleDateFormat的时区设置为UTC。当您未指定时区时,它会从JVM中获取其时区,如果没有另外指定,则通常从操作系统中获取它。您的JVM使用UTC是一种标准做法,所以不足为奇。

无论如何,您使用的日期时间类SimpleDateFormatCalendar的设计很差,尤其是前者非常麻烦。幸运的是,两者早已过时。而是使用现代Java日期和时间API java.time。

  

我刚刚注意到电话时间也落后了3个小时。是   有没有办法改变它?

电话系统时钟很可能是正确的(甚至可以从时间服务器自动更新),但是其时区设置为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

链接

答案 1 :(得分:0)

Date没有任何时区信息;它只是一个long周围的包装,假定为UTC纪元毫秒。您的时区比UTC早3个小时,而格式化的时间比UTC早3个小时,这并非巧合。

尽管您可以在以下位置指定SimpleDateFormat呈现Date的时区:

SimpleDateFormat format = new SimpleDateFormat("M/d/yyyy&HH:mm");
format.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"));

由于存在很多问题,DateCalendar已被弃用。

改为使用LocalDateTimeDateTimeFormatter

String timeStamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("M/d/yyyy&HH:mm"));