Jboss Java日期夏令时
有地点,时间时钟,由于移动到夏令时(每年两次)的问题,日期是不正确的在Java中(我驻中欧: GMT+2
,夏季GMT+1
在冬季)
如果时间提前1小时移动, new Date()
仍旧返回旧时间(比当前时间晚1小时)。
在Java 7中,这可以解决,而无需重新启动Jboss应用程序服务器?
如果我在Windows中手动更改时间,请重现此问题:除非重新启动jboss,否则Date
不会更新到系统日期。
Calendar c = Calendar.getInstance();
c.setTime(new Date());
在Java <= 7中 ,您可以使用ThreeTen Backport,这是Java 8新日期/时间类的一个很好的后端。
有了这个,您可以轻松处理DST更改。
首先,您可以使用org.threeten.bp.DateTimeUtils
将日期转换为Calendar
。
下面的代码将Calendar
转换为org.threeten.bp.Instant
,它是一个表示“UTC时刻”的类(独立于时区的时间戳:现在,世界上的每个人都在同一瞬间,虽然他们当地的日期和时间可能会有所不同,取决于他们在哪里)。
然后, Instant
会转换为org.threeten.bp.ZonedDateTime
(这意味着:在这个时候,这个时区的日期和时间是什么?)。 我还使用org.threeten.bp.ZoneId
获取时区:
Calendar c = Calendar.getInstance();
c.setTime(new Date());
// get the current instant in UTC timestamp
Instant now = DateTimeUtils.toInstant(c);
// convert to some timezone
ZonedDateTime z = now.atZone(ZoneId.of("Europe/Berlin"));
// today is 08/06/2017, so Berlin is in DST (GMT+2)
System.out.println(z); // 2017-06-08T14:11:58.608+02:00[Europe/Berlin]
// testing with a date in January (not in DST, GMT+1)
System.out.println(z.withMonth(1)); // 2017-01-08T14:11:58.608+01:00[Europe/Berlin]
我刚刚选择了一些使用中欧时区( Europe/Berlin
)的时区:您不能使用这些3字母缩写,因为它们不明确而不是标准。 您可以将代码更改为最适合您系统的时区(您可以使用ZoneId.getAvailableZoneIds()
获取所有可用时区的列表)。
我更喜欢这个解决方案,因为它明确指出我们用什么时区向用户显示( Date
和Calendar
的toString()
方法在幕后使用默认时区,并且你永远不知道他们在做什么)。
而在内部,我们可以继续使用的Instant
,这是UTC,所以它不受时区的影响(你可以随时转换,并从时区时,你需要) -如果你想将转换ZonedDateTime
回的Instant
,只是使用toInstant()
方法。
实际上,如果你想获得当前的日期/时间,只要忘记旧的类( Date
和Calendar
),并使用Instant
:
// get the current instant in UTC timestamp
Instant now = Instant.now();
但是如果你仍然需要使用旧的类,只需使用DateTimeUtils
来完成转换即可。
以上示例的输出是ZonedDateTime.toString()
方法的结果。 如果要更改格式,请使用org.threeten.bp.format.DateTimeFormatter
类(有关所有可能格式的更多详细信息,请参阅javadoc):
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss z X");
// DST (GMT+02)
System.out.println(formatter.format(z)); // 08/06/2017 14:11:58 CEST +02
// not DST (GMT+01)
System.out.println(formatter.format(z.withMonth(1))); // 08/01/2017 14:11:58 CET +01
使用JDK 8 java.time
ZonedDateTime
类。 它适应夏令时更改。 请参阅以下网址的详细信息:https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html