带有 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。设置具有特定 ZoneId
或 ZoneOffset
的时区(使用 atZone
创建 ZonedDateTime
),你会得到相同的 date/time 但在不同的时区(所以这是一个不同的时刻)。
相反,您应该通过使用 LocalDateTime.now(ZoneId)
:
指定 ZoneId
或 ZoneOffset
来构建 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));
我想打印 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。设置具有特定 ZoneId
或 ZoneOffset
的时区(使用 atZone
创建 ZonedDateTime
),你会得到相同的 date/time 但在不同的时区(所以这是一个不同的时刻)。
相反,您应该通过使用 LocalDateTime.now(ZoneId)
:
ZoneId
或 ZoneOffset
来构建 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));