Java使用Instant.parse校验日期报错 如何验证字符串是否为合法Instant格式
错误原因
Instant.parse() 仅原生支持 ISO-8601标准的UTC时间格式,要求输入字符串满足yyyy-MM-dd'T'HH:mm:ss.SSS'Z'结构:日期和时间之间必须用T分隔,末尾需要带UTC时区标识Z。你传入的2021-09-29 09:35:07.531字符串在索引10的位置是空格,不符合格式要求,因此抛出解析异常。
校验实现方案
根据你的需求分两种实现方式:
仅校验原生Instant支持的ISO-8601格式
如果要求输入的字符串必须是可直接被Instant.parse()解析的标准格式,直接用try-catch包裹解析逻辑即可,无需额外处理:
import java.time.Instant; import java.time.format.DateTimeParseException; public boolean isValidInstant(String dateStr) { try { Instant.parse(dateStr); return true; } catch (DateTimeParseException e) { return false; } }
只要方法返回true,就说明字符串是合法的Instant格式。
兼容导入场景常用的空格分隔日期格式
如果需要适配Excel单元格常见的yyyy-MM-dd HH:mm:ss.SSS类不带T和时区标识的格式,可以自定义格式化器指定规则后做解析校验:
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.time.ZoneOffset; public boolean isValidImportDate(String dateStr) { // 方括号包裹的[.SSS]表示毫秒部分可选,兼容带/不带毫秒的日期 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss[.SSS]") // 按你实际存储的时区调整,东八区可替换为ZoneOffset.ofHours(8) .withZone(ZoneOffset.UTC); try { LocalDateTime.parse(dateStr, formatter); return true; } catch (DateTimeParseException e) { return false; } }
如果需要将合法字符串转换为Instant存入数据库,只需要在解析后追加.toInstant(ZoneOffset.UTC)即可。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

