Kotlin解析Calendar转换的日期文本抛出DateTimeParseException求助
解决LocalDate.parse解析Calendar.time.toString()抛出的DateTimeParseException问题
这个异常的核心原因很直白:Calendar.time.toString()返回的字符串格式,和LocalDate.parse()默认使用的**ISO_LOCAL_DATE格式(yyyy-MM-dd)**完全不匹配。
Calendar的toString()输出的是类似Wed Sep 18 14:23:45 CST 2024这样带星期、月份缩写、时间、时区的字符串,而LocalDate默认只认识纯日期的标准格式,自然会解析失败。下面给你两种靠谱的解决方案:
方案一:存储时使用标准日期格式(推荐)
别直接用calendar.time.toString()存日期,主动把日期格式化为标准、可解析的字符串,这样后续操作不会有兼容性问题:
import java.util.Calendar import java.time.format.DateTimeFormatter import java.time.LocalDate import java.time.ZoneId fun main() { val daysAgo = 3 // 获取调整后的日期 val calendar = Calendar.getInstance() calendar.add(Calendar.DAY_OF_YEAR, -daysAgo) // 选用ISO标准日期格式(yyyy-MM-dd) val dateFormatter = DateTimeFormatter.ISO_LOCAL_DATE // 将Calendar时间转换为LocalDate后再格式化存储 val time = dateFormatter.format( calendar.time.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate() ) // 后续解析并减2天 val date = LocalDate.parse(time) val twoDaysEarlier = date.minusDays(2) println(twoDaysEarlier) // 输出类似2024-09-15 }
方案二:如果已存储toString()结果,用对应格式解析
要是你已经把calendar.time.toString()的结果存在了标签里,可以先确定它的格式,再创建匹配的DateTimeFormatter来解析:
import java.time.LocalDate import java.time.format.DateTimeFormatter import java.util.Locale fun main() { // 假设这是从标签中获取的字符串 val time = "Wed Sep 18 14:23:45 CST 2024" // 匹配Calendar.toString()的格式,注意Locale要和输出一致(这里用ENGLISH适配英文月份缩写) val formatter = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH ) // 先解析为ZonedDateTime,再提取LocalDate val date = formatter.parse(time, java.time.ZonedDateTime::from).toLocalDate() val twoDaysEarlier = date.minusDays(2) println(twoDaysEarlier) // 输出2024-09-16 }
注意事项:
- 方案二的格式字符串和Locale必须严格匹配
toString()的输出,比如系统是中文环境时,toString()可能输出中文星期和月份,这时候要把Locale改成Locale.CHINESE,格式字符串也要对应调整。 - 优先选方案一,因为
Calendar.toString()的格式依赖JDK实现,不同版本或环境可能有细微差异,标准格式的兼容性和可读性都更优。
内容的提问来源于stack exchange,提问作者Sami
相关产品推荐
相关产品推荐

