You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 04:57:02