Java中比较ActionTimestamp与Posteventtimestamp并更新为当前时间
问题根因
代码运行报错的核心原因有2个:
DateTimeFormatter匹配规则错误:模式串中的格式符Z仅能匹配+0800、-0530这类带正负号的时区偏移值,无法匹配时间戳末尾代表UTC时区的字面量Z,直接触发解析异常。- 时间生成逻辑时区不匹配:直接调用
ZonedDateTime.now()获取的是系统默认时区的时间,格式化后既不会输出末尾的Z标识,时间值也和UTC标准时间存在时区偏差,不符合格式要求。
可直接运行的修复代码
你的时间戳是固定UTC零时区格式,用OffsetDateTime处理比ZonedDateTime更轻量,也不会引入多余的时区规则干扰判断。
首先修正格式化器定义:
import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.util.stream.Collectors; // 格式化器全局单例即可,末尾Z作为字面量匹配,强制使用UTC时区做解析/格式化 private static final DateTimeFormatter UTC_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss'Z'") .withZone(ZoneOffset.UTC);
修复实体筛选逻辑:
List<PostEventEntity> validList = postEventInfoList.stream() .filter(e -> { OffsetDateTime actionTime = OffsetDateTime.parse(e.getActionTimestamp(), UTC_FORMATTER); // PostEventTimestamp为空直接保留 if (e.getPostEventTimestamp() == null) { return true; } OffsetDateTime postEventTime = OffsetDateTime.parse(e.getPostEventTimestamp(), UTC_FORMATTER); return actionTime.isAfter(postEventTime); }) .collect(Collectors.toList());
修复时间戳更新方法:
private void updatePostEventTimestamp(List<PostEventEntity> postEventInfoList) { // 显式取UTC时区当前时间,保证格式和时区都符合要求 String currentUtcTime = OffsetDateTime.now(ZoneOffset.UTC).format(UTC_FORMATTER); postEventInfoList.forEach(event -> event.setPostEventTimestamp(currentUtcTime)); }
注意事项
如果需要将解析出的时间和当前本地时间做对比,不要直接拿系统默认时区的时间对象做比较,先把本地时间转为UTC时区的
OffsetDateTime再调用比较方法,避免时区差导致先后顺序判断错误。
内容的提问来源于stack exchange,提问作者sravs
相关产品推荐
相关产品推荐

