关于DateTimeFormatterBuilder的appendZoneText非首选时区行为的疑问
DateTimeFormatterBuilder.appendZoneText处理非首选时区的行为
你提供的代码如下:
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); // Append date and time components builder.append(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); // Append zone text with preferred zones builder.appendZoneText(TextStyle.SHORT, Set.of(ZoneId.of("Asia/Tokyo"),ZoneId.of("America/Los_Angeles"))); // Create the DateTimeFormatter DateTimeFormatter formatter = builder.toFormatter(); // Format a date and time ZonedDateTime dateTime = ZonedDateTime.now(); String formattedText = dateTime.format(formatter); // Print the formatted text System.out.println(formattedText);
关于appendZoneText在处理非首选时区时的具体表现,规则如下:
- 时区在首选集合内:会严格按照指定的
TextStyle.SHORT输出该时区的本地化简称,比如Asia/Tokyo输出JST,America/Los_Angeles根据夏令时输出PDT或PST。 - 时区不在首选集合内:不会替换为集合中的任意时区,而是直接输出当前时区对应
TextStyle.SHORT的默认显示形式——可能是通用时区缩写(如中国时区的CST),也可能是UTC偏移格式(如UTC+08:00),具体取决于该时区的元数据和系统本地化配置。
你观察到的“结果无变化”,本质是当时区不在首选集合时,格式化输出的是当前时区的默认短样式文本,而非强制切换到首选集合里的时区标识。如果需要将非首选时区的时间转换为集合内时区的时间再格式化,需要先调用ZonedDateTime.withZoneSameInstant()方法转换时区,再执行格式化操作。
内容的提问来源于stack exchange,提问作者Mat
相关产品推荐
相关产品推荐

