为什么LocalDateTime生成整点的时间戳结尾会多个1?

具体的代码我就不全贴了,主要就是生成时间戳

//在方法外面定义了一个DateTimeFormatter 

static DateTimeFormatter df = DateTimeFormatter.ofPattern("yyMMddHH");

//在一个定时任务内部会去读文件名中的时间,time就是时间,跟DateTimeFormatter的格式是匹配的

long ts = LocalDateTime.parse(time, df).toInstant(ZoneOffset.of("+8")).toEpochMilli();

结果生成的时间戳入库后最后面有的跟个1,有的跟个2是为什么呀?


回答:

判断是因为时间精度的问题导致生成的时间戳后面跟了1或2。
使用了LocalDateTime.parse方法将时间字符串time解析成了LocalDateTime类型,然后调用toInstant方法将其转换成Instant类型,并指定了时间偏移量为+8,最后调用toEpochMilli方法获取时间戳。这种方式生成时间戳的精度是毫秒级别的,而由于时间戳的生成是根据当前系统时间而来,所以存在微小的时间差异,即可能存在千分之一毫秒以下的时间差异,从而导致最后生成的时间戳末尾有1或2的情况。

为了避免这种情况的出现,可以将时间精度提高到微秒级别,即将DateTimeFormatter中的格式改为"yyMMddHHmmssSSS",并将toEpochMilli方法改为toEpochSecond方法,并且结果乘以1000来得到秒级别的时间戳。这样生成的时间戳的精度将提高到微秒级别,可以有效避免生成时间戳末尾带有1或2的情况。

具体修改方法如下:

static DateTimeFormatter df = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS");

long ts = LocalDateTime.parse(time, df).toInstant(ZoneOffset.of("+8")).getEpochSecond() * 1000;

以上是 为什么LocalDateTime生成整点的时间戳结尾会多个1? 的全部内容, 来源链接: utcz.com/p/945104.html

回到顶部