如何将LocalDateTime转换为UUID并还原为日期时间,解决时间戳异常问题
问题根因
你生成时间UUID时传入的参数错误:ChronoField.MILLI_OF_DAY的取值是指定时间距离当天零点的毫秒数,而非从1970-01-01T00:00:00 UTC开始计算的全局Unix时间戳。
你代码中
LocalDateTime.parse( "2021-10-07T21:45:14" ).getLong( ChronoField.MILLI_OF_DAY )返回值为78314000,恰好对应UTC时间1970-01-01 21:45:14的时间戳,和你解析UUID得到的错误结果完全吻合。
修复方案
需要先把无时区信息的LocalDateTime绑定对应时区,转换为全局时间戳后再传入生成UUID,示例代码如下:
// 1. 绑定你当前时间对应的时区,示例为东八区,可根据实际场景调整 ZoneId targetZone = ZoneId.of("Asia/Shanghai"); // 2. 转换得到对应全局Unix时间戳(毫秒级) long epochMilli = LocalDateTime.parse("2021-10-07T21:45:14") .atZone(targetZone) .toInstant() .toEpochMilli(); // 3. 传入正确时间戳生成时间UUID UUID timeUuid = UUIDGen.getTimeUUID(epochMilli);
注意事项
- 不要省略时区绑定步骤:
LocalDateTime本身不携带时区信息,直接转换会默认使用系统时区,可能导致跨环境生成的时间戳不一致 - 生成后可通过UUID的
timestamp()属性反向转换为Instant,和原时间做校验,确认转换正确
内容的提问来源于stack exchange,提问作者dname
相关产品推荐
相关产品推荐

