带T分隔符与Z零时区偏移的时间戳无法解析为MMddHHmmss的原因
问题原因
你遇到的错误核心是解析格式与输入字符串完全不匹配:
- 你生成的
srcFileTS是20240906T123119Z格式,包含T分隔符和Z零时区标识; - 但用来解析的
tgtFormatter格式是MMddHHmmss,只接受纯数字的月、日、时、分、秒,根本无法识别T和Z字符,所以解析到第8位(也就是T的位置)时直接报错。
另外还有个概念误区:LocalDateTime是不带时区的时间类型,而你的输入字符串带Z时区标识,用LocalDateTime处理其实并不合适,应该用OffsetDateTime或ZonedDateTime来处理带时区偏移的时间。
解决方案
正确的流程是先把带T和Z的字符串解析成合法的时间对象,再格式化成你需要的MMddHHmmss格式:
// 保留原生成带Z的时间字符串的逻辑 def srcFormatter = DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss'Z'") def srcFileTS = LocalDateTime.now().format(srcFormatter) // 第一步:用原格式解析成带时区的时间对象(OffsetDateTime适配带Z的零时区场景) def parsedDateTime = OffsetDateTime.parse(srcFileTS, srcFormatter) // 第二步:格式化成目标格式 def tgtTSFormat = "MMddHHmmss" def tgtFormatter = DateTimeFormatter.ofPattern(tgtTSFormat) def tgtFileTS = parsedDateTime.format(tgtFormatter) println(tgtFileTS) // 输出示例:0906123119
如果不需要先转成字符串再解析的中间步骤,直接从当前时间转换更高效:
def tgtFormatter = DateTimeFormatter.ofPattern("MMddHHmmss") // 带时区的场景用OffsetDateTime def tgtFileTS = OffsetDateTime.now().format(tgtFormatter) // 不需要时区的话直接用LocalDateTime // def tgtFileTS = LocalDateTime.now().format(tgtFormatter)
关键注意事项
- 解析字符串时,格式必须和输入字符串的结构完全对应,不能随意忽略
T、Z这类特殊标识; - 带时区标识的时间字符串,优先用
OffsetDateTime或ZonedDateTime处理,避免时区信息丢失。
内容的提问来源于stack exchange,提问作者user3411153
相关产品推荐
相关产品推荐

