带有ZoneOffset的时间戳格式

时间:2015-12-15 09:06:51

标签: java time formatting java-time

我想使用基于UTC的不同时间偏移打印now():

offset=ZoneOffset.ofHours(-1);
zoneId=ZoneId.ofOffset("UTC", offset);
timeStampformater=DateTimeFormatter.ofPattern("yyyy.MM.dd.hh.mm.ss").withZone(zoneId);
System.out.println(LocalDateTime.now().format(timeStampformater));

offset=ZoneOffset.ofHours(0);
zoneId=ZoneId.ofOffset("UTC", offset);
timeStampformater=DateTimeFormatter.ofPattern("yyyy.MM.dd.hh.mm.ss").withZone(zoneId);
System.out.println(LocalDateTime.now().format(timeStampformater));

offset=ZoneOffset.ofHours(1);
zoneId=ZoneId.ofOffset("UTC", offset);
timeStampformater=DateTimeFormatter.ofPattern("yyyy.MM.dd.hh.mm.ss").withZone(zoneId);
System.out.println(LocalDateTime.now().format(timeStampformater));

但它始终打印相同的当地时间:

2015.12.15.09.56.00  -> should be 7:56
2015.12.15.09.56.00  -> should be 8:56
2015.12.15.09.56.00  -> OK because it is the local time.

2 个答案:

答案 0 :(得分:1)

方法DateTimeFormatter.withZone不会更改日期/时间。在内部,格式化程序将时区设置为格式化的日期/时间,然后对其进行格式化。引用它的Javadoc:

  

在所有其他情况下,覆盖区域将添加到时间,替换任何以前的区域,但不会更改日期/时间。

LocalDateTime.now()始终返回默认时区中的当前日期/时间。设置具有特定ZoneIdZoneOffset的时区(使用atZone创建ZonedDateTime),您可以获得相同的日期/时间但是在不同的时区(因此它是一个不同的时刻)。

相反,您应该使用LocalDateTime.now(ZoneId)指定LocalDateTimeZoneId来构建ZoneOffset

offset = ZoneOffset.ofHours(-1);
zoneId = ZoneId.ofOffset("UTC", offset);
timeStampformater = DateTimeFormatter.ofPattern("yyyy.MM.dd.hh.mm.ss");
System.out.println(LocalDateTime.now(zoneId).format(timeStampformater));

offset = ZoneOffset.ofHours(0);
zoneId = ZoneId.ofOffset("UTC", offset);
timeStampformater = DateTimeFormatter.ofPattern("yyyy.MM.dd.hh.mm.ss");
System.out.println(LocalDateTime.now(zoneId).format(timeStampformater));

offset = ZoneOffset.ofHours(1);
zoneId = ZoneId.ofOffset("UTC", offset);
timeStampformater = DateTimeFormatter.ofPattern("yyyy.MM.dd.hh.mm.ss");
System.out.println(LocalDateTime.now(zoneId).format(timeStampformater));

请注意,您可以通过不使用ZoneId变量来简单地使用代码。

offset = ZoneOffset.ofHours(-1);
timeStampformater = DateTimeFormatter.ofPattern("yyyy.MM.dd.hh.mm.ss");
System.out.println(LocalDateTime.now(offset).format(timeStampformater));

答案 1 :(得分:1)

您不需要中间ZoneId对象 - 如果您对偏移时间感兴趣,可以直接使用OffsetDateTime并对其应用偏移量,而不是向格式化程序应用偏移量(应用程序的规则)格式化程序的偏移量有些令人费解。)

类似的东西:

DateTimeFormatter timeStampformater = DateTimeFormatter.ofPattern("yyyy.MM.dd.hh.mm.ss");

ZoneOffset offset = ZoneOffset.ofHours(-1);
System.out.println(OffsetDateTime.now(offset).format(timeStampformater));