我想使用基于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.
答案 0 :(得分:1)
方法DateTimeFormatter.withZone
不会更改日期/时间。在内部,格式化程序将时区设置为格式化的日期/时间,然后对其进行格式化。引用它的Javadoc:
在所有其他情况下,覆盖区域将添加到时间,替换任何以前的区域,但不会更改日期/时间。
LocalDateTime.now()
始终返回默认时区中的当前日期/时间。设置具有特定ZoneId
或ZoneOffset
的时区(使用atZone
创建ZonedDateTime
),您可以获得相同的日期/时间但是在不同的时区(因此它是一个不同的时刻)。
相反,您应该使用LocalDateTime.now(ZoneId)
指定LocalDateTime
或ZoneId
来构建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));