带有 ZoneOffset 的时间戳格式

Timestamp format with ZoneOffset

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

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.

方法DateTimeFormatter.withZone不改变date/time。在内部,格式化程序将时区设置为 date/time 进行格式化,然后再进行格式化。引用其 Javadoc:

In all other cases, the override zone is added to the temporal, replacing any previous zone, but without changing the date/time.

LocalDateTime.now() 始终 returns 默认时区中的当前 date/time。设置具有特定 ZoneIdZoneOffset 的时区(使用 atZone 创建 ZonedDateTime),你会得到相同的 date/time 但在不同的时区(所以这是一个不同的时刻)。

相反,您应该通过使用 LocalDateTime.now(ZoneId):

指定 ZoneIdZoneOffset 来构建 LocalDateTime
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));

您不需要中间 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));