如何使用DateTimeFormatter实现日期时间格式化输出一致性
问题根因
当前输出格式不统一的核心原因有两点:
- 你使用的
DateTimeFormatter.ISO_OFFSET_DATE_TIME本身的规则就是动态适配偏移量:当时间偏移为0时输出Z标识,偏移不为0时输出+hh:mm格式的偏移量,不符合你要的统一Z后缀的要求。 - 你没有将不同偏移的输入时间统一转换为UTC时间,不同输入自带的偏移量被保留,自然输出结果格式不一致。
可行解决方案
你只需要调整getDateTimeString方法的逻辑,先将所有输入的OffsetDateTime统一转换为UTC时区的同时间点,再使用固定格式输出即可,不需要修改现有解析逻辑。
修改后的代码示例
// 保留你原来的解析格式化器不变 DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder() .appendValue(ChronoField.YEAR, 4) .optionalStart() .appendLiteral("-") .optionalEnd() .appendValue(ChronoField.MONTH_OF_YEAR, 2) .optionalStart() .appendLiteral("-") .optionalEnd() .appendValue(ChronoField.DAY_OF_MONTH, 2) .appendLiteral('T') .appendPattern("HH':'mm':'ss[XXX][X]") .toFormatter(); // 新增UTC格式化器,固定输出带Z的格式 private static final DateTimeFormatter UTC_OUTPUT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssX"); public OffsetDateTime convert(String dateTime) { return OffsetDateTime.parse(dateTime, FORMATTER); } public String getDateTimeString(OffsetDateTime offsetDateTime) { // 先将时间转换为UTC时区的同时间点,再格式化 return offsetDateTime.withOffsetSameInstant(ZoneOffset.UTC) .format(UTC_OUTPUT_FORMATTER); } public void doStuff(String input) { OffsetDateTime odt = convert(input); String finalResult = getDateTimeString(odt); }
注意:格式化模式里请使用小写
yyyy代表公历年,大写YYYY是基于周的周年,跨年周使用时会出现不符合预期的结果。
效果验证
你给出的两个输入经过修改后代码处理的输出如下:
- 输入
2020-06-29T01:00:00+01:00:转换为UTC时间是2020-06-29T00:00:00Z,符合要求 - 输入
2021-08-18T21:00:00+0000:本身就是UTC时间,输出为2021-08-18T21:00:00Z,符合要求
内容的提问来源于stack exchange,提问作者stackoverflowflowflwofjlw
相关产品推荐
相关产品推荐

