appendZoneId() 与appendZoneOrOffsetId() java DateTimeFormatterBuilder

问题描述 投票:0回答:1

我不清楚何时使用appendZoneId()以及何时使用appendZoneOrOffsetId()
在 java DateTimeFormatterBuilder

在java文档中说两者都附加ZoneId或OffsetId,那么appendZoneId()和appendZoneOrOffsetId()之间的区别是什么

java
1个回答
0
投票

appendZoneOrOffsetId()的文档说:

请注意,除了用于获取区域的机制之外,此方法与 appendZoneId() 相同。

获取区域的机制差异如下:

  • 追加区域 ID:
    “使用相当于使用 TemporalQueries.zoneId() 查询时间的机制来获取区域”
  • appendZoneOrOffsetId:
    “使用相当于使用 TemporalQueries.zone() 查询时间的机制来获取区域”

在实践中,您是否会看到差异取决于您尝试格式化的日期时间类型 - 它是否包含区域 ID 还是仅包含偏移量。考虑以下代码:

public static void main(String[] args) {
    DateTimeFormatter dtfZ = new DateTimeFormatterBuilder().appendZoneId().toFormatter();
    DateTimeFormatter dtfZO = new DateTimeFormatterBuilder().appendZoneOrOffsetId().toFormatter();
    tryPrint(ZonedDateTime.now(), dtfZ, "appendZoneId");
    tryPrint(ZonedDateTime.now(), dtfZO, "appendZoneOrOffsetId");
    tryPrint(OffsetDateTime.now(), dtfZ, "appendZoneId");
    tryPrint(OffsetDateTime.now(), dtfZO, "appendZoneOrOffsetId");
}

private static void tryPrint(TemporalAccessor dt, DateTimeFormatter dtf, String description) {
    System.out.printf("Trying to format %s using %s:%n\t", dt, description);
    try {
        System.out.println(dtf.format(dt));
    } catch (DateTimeException e) {
        System.out.println(e);
    }
    System.out.println();
}

输出:

Trying to format 2024-09-24T13:08:10.042968898+01:00[Europe/London] using appendZoneId:
    Europe/London

Trying to format 2024-09-24T13:08:10.045608600+01:00[Europe/London] using appendZoneOrOffsetId:
    Europe/London

Trying to format 2024-09-24T13:08:10.046282182+01:00 using appendZoneId:
    java.time.DateTimeException: Unable to extract ZoneId from temporal 2024-09-24T13:08:10.046282182+01:00

Trying to format 2024-09-24T13:08:10.046858510+01:00 using appendZoneOrOffsetId:
    +01:00

如您所见,如果您想使用区域 ID 格式化日期时间,那么您可以使用其中之一。但如果你只有偏移量而不是区域,那么你需要使用

appendZoneOrOffsetId

© www.soinside.com 2019 - 2024. All rights reserved.