Scala/Java按指定模式解析日期创建时间戳报错如何解决?
异常触发原因
你的输入时间字符串"2021-08-25 12:13:33"不带时区信息,而ZonedDateTime.parse()方法要求解析的内容必须包含时区字段才能构造ZonedDateTime实例,你使用的时间格式yyyy-MM-dd HH:mm:ss也没有定义时区占位符,所以解析时无法从时间文本中获取ZoneId,直接抛出异常。
可行解决方案
方案1:先解析为LocalDateTime再补时区转换
如果你的输入时间默认对应本地时区,可使用该方案:
import java.time._ import java.time.format.DateTimeFormatter val time = "2021-08-25 12:13:33" val format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") // 先解析为不带时区的LocalDateTime val localDateTime = LocalDateTime.parse(time, format) // 绑定对应时区转成ZonedDateTime,如输入为东八区可替换为ZoneId.of("Asia/Shanghai"),按需调整即可 val zonedDateTime = localDateTime.atZone(ZoneId.systemDefault()) // 转UTC时间 val utcTime = zonedDateTime.withZoneSameInstant(ZoneOffset.UTC) // 生成秒级时间戳,如需毫秒级可调用toEpochMilli val timestamp = zonedDateTime.toInstant.getEpochSecond
方案2:给DateTimeFormatter绑定默认时区,直接解析ZonedDateTime
如果所有输入时间都对应同一个固定时区,可以直接给格式化器预设时区,不需要修改解析逻辑:
import java.time._ import java.time.format.DateTimeFormatter val time = "2021-08-25 12:13:33" // 给格式化器绑定默认时区,输入时间都按这个时区解析 val format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") .withZone(ZoneId.systemDefault()) val instant = ZonedDateTime.parse(time, format).toInstant val utcTime = ZonedDateTime.ofInstant(instant, ZoneOffset.UTC)
方案3:修改时间格式带时区字段(仅当你能修改输入时间格式时使用)
如果输入时间可以增加时区后缀,直接修改格式和输入即可:
// 输入时间带时区,比如东八区后缀+08:00 val time = "2021-08-25 12:13:33 +08:00" val format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss XXX") val zonedDateTime = ZonedDateTime.parse(time, format)
内容的提问来源于stack exchange,提问作者Izmo
相关产品推荐
相关产品推荐

