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()获取所有可用时区的列表)。

我更喜欢这个解决方案,因为它明确指出我们用什么时区向用户显示( DateCalendartoString()方法在幕后使用默认时区,并且你永远不知道他们在做什么)。

而在内部,我们可以继续使用的Instant ,这是UTC,所以它不受时区的影响(你可以随时转换,并从时区时,你需要) -如果你想将转换ZonedDateTime回的Instant ,只是使用toInstant()方法。


实际上,如果你想获得当前的日期/时间,只要忘记旧的类( DateCalendar ),并使用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

链接地址: http://www.djcxy.com/p/5005.html

上一篇: Jboss Java Date daylight saving time

下一篇: Linux daylight savings notification