使用java.time解析无'T'分隔符的日期时间字符串并提取LocalTime的问题
使用java.time解析无'T'分隔符的日期时间字符串并提取LocalTime的问题
嘿,这个问题我之前也碰到过,咱们一步步拆解来看:
首先为啥你第一个调用会报错?因为DateTimeFormatter.ISO_LOCAL_DATE_TIME这个预定义格式化器,严格遵循ISO 8601标准,要求日期和时间部分必须用T分隔,所以带空格的字符串就不符合它的格式规则,自然抛出DateTimeParseException。
那有没有现成的预定义常量能直接处理空格分隔的情况呢?很遗憾,Java标准库的java.time.format.DateTimeFormatter里没有提供这样的内置常量。不过不用慌,有两种既省心又符合你需求的替代方案:
方案一:先替换空格为'T',复用现有常量
这是最简单的办法,利用字符串替换把空格换成T,然后直接用ISO_LOCAL_DATE_TIME解析,最后提取LocalTime:
String input = "2023-05-10 09:41:00"; // 把空格替换成ISO标准要求的'T' String adjustedInput = input.replace(' ', 'T'); LocalTime localTime = LocalTime.parse(adjustedInput, DateTimeFormatter.ISO_LOCAL_DATE_TIME); System.out.println(localTime); // 输出:09:41:00
这种方式完全复用了官方预定义的格式化器,不用自己写格式模式,省心又不容易出错。
方案二:复用预定义格式组合新的格式化器
如果不想做字符串替换,也可以用DateTimeFormatterBuilder把现有的ISO_LOCAL_DATE和ISO_LOCAL_TIME组合起来,中间用空格分隔:
DateTimeFormatter formatter = new DateTimeFormatterBuilder() .append(DateTimeFormatter.ISO_LOCAL_DATE) // 复用预定义的日期格式 .appendLiteral(' ') // 添加空格分隔符 .append(DateTimeFormatter.ISO_LOCAL_TIME) // 复用预定义的时间格式 .toFormatter(); LocalTime localTime = LocalTime.parse("2023-05-10 09:41:00", formatter); System.out.println(localTime); // 输出:09:41:00
当然,如果你觉得Builder写法有点繁琐,也可以直接用简单的模式字符串:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalTime localTime = LocalTime.parse("2023-05-10 09:41:00", formatter);
这种写法更直观,模式字符串也很容易理解。
总结一下:如果想尽量复用官方预定义的常量,方案一是最优解;如果不想修改原字符串,方案二的两种写法都能满足需求,而且比完全自定义格式化器要省心~
备注:内容来源于stack exchange,提问作者mars8
相关产品推荐
相关产品推荐

