如何使用Instant将TemporalAccessor转换为毫秒时间戳并解决解析报错
报错原因
你定义的DateTimeFormatter没有绑定时区信息,解析得到的TemporalAccessor仅包含日期时间的字面量值,没有Instant必需的时区偏移量参数,因此Instant.from()无法完成转换抛出异常。
解决方法
两种常用方案可选:
- 方案一:给DateTimeFormatter绑定默认时区
构造Formatter时直接指定对应时区,后续解析得到的TemporalAccessor就会携带时区信息,可以直接转Instant。代码示例:
// 这里以系统默认时区为例,若输入时间为UTC时区可替换为ZoneOffset.UTC DateTimeFormatter formatter = new DateTimeFormatterBuilder() .appendPattern("yyyy-MM-dd HH:mm:ss") .appendFraction(ChronoField.MICRO_OF_SECOND, 0, 6, true) .toFormatter() .withZone(ZoneId.systemDefault()); TemporalAccessor accessor = formatter.parse("1970-01-01 00:01:00.00"); Instant instant = Instant.from(accessor); // 直接调用toEpochMilli即可获取Unix毫秒时间戳 long timestamp = instant.toEpochMilli();
- 方案二:先解析为LocalDateTime再手动绑定时区
如果不想修改原有Formatter的定义,可以先将解析结果转换为LocalDateTime,手动绑定时区后再转Instant:
DateTimeFormatter formatter = new DateTimeFormatterBuilder() .appendPattern("yyyy-MM-dd HH:mm:ss") .appendFraction(ChronoField.MICRO_OF_SECOND, 0, 6, true) .toFormatter(); LocalDateTime localDt = LocalDateTime.parse("1970-01-01 00:01:00.00", formatter); // 绑定对应时区后转Instant Instant instant = localDt.atZone(ZoneId.systemDefault()).toInstant(); long timestamp = instant.toEpochMilli();
注意:时区选择需要和你输入的时间字符串对应的实际时区保持一致,否则会出现时间偏移错误
内容的提问来源于stack exchange,提问作者user11579923
相关产品推荐
相关产品推荐

