我使用SimpleDateFormat获取当前日期和小时,该日期运行良好,但由于未知原因,小时值倒退了3小时。 例如,如果我将在19:40运行代码,则时间值为16:40,而我不知道为什么。 非常感谢您的帮助。
TypeError
答案 0 :(得分:1)
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
我不知道您的时区是什么,并且请您指定正确的时区。这很重要。
是的,java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6 。
org.threeten.bp
导入日期和时间类。正如其他人所说,您的问题是时区问题。显然您的SimpleDateFormat
的时区设置为UTC。当您未指定时区时,它会从JVM中获取其时区,如果没有另外指定,则通常从操作系统中获取它。您的JVM使用UTC是一种标准做法,所以不足为奇。
无论如何,您使用的日期时间类SimpleDateFormat
和Calendar
的设计很差,尤其是前者非常麻烦。幸运的是,两者早已过时。而是使用现代Java日期和时间API java.time。
我刚刚注意到电话时间也落后了3个小时。是 有没有办法改变它?
电话系统时钟很可能是正确的(甚至可以从时间服务器自动更新),但是其时区设置为UTC。应该有一种方法可以在电话设置中将其设置为您的时区(然后,JVM也可能会使用它。)
顺便说一句,您的时间戳格式是特殊的。我建议您使用标准格式,最好是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.time
。java.time
向Java 6和7(JSR-310的ThreeTen)的反向端口。答案 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"));
由于存在很多问题,Date
和Calendar
已被弃用。
改为使用LocalDateTime
和DateTimeFormatter
:
String timeStamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("M/d/yyyy&HH:mm"));