Joda Time 2.10.1无法转换CEST+0200格式日期至LocalTime求助
解决Joda Time解析"CEST+0200"格式日期的问题
我完全懂你踩的这个坑——Joda Time的默认格式解析对这种时区名称和偏移量直接拼接的格式不买账,哪怕调了Locale也没用。咱们直接上可行的解决方案:
问题根源
你用的yyyy-MM-dd HH:mm:ss zZ模式,Joda Time默认期望时区名称(z)和偏移量(Z)之间有空格分隔(比如CEST +0200),但你的输入是CEST+0200,两者连在一起,导致解析器没法正确拆分识别,所以抛出格式错误。
解决方案1:调整输入字符串(简单直接)
先通过正则表达式在时区名称和偏移量之间插入空格,再用原格式解析:
val input = "2019-05-10 18:45:00 CEST+0200" // 匹配时区名称(大写字母)和偏移量(+/-四位数字),插入空格 val adjustedInput = input.replace("([A-Z]+)([+-]\\d{4})".toRegex(), "$1 $2") val dateTimeFormatter = DateTimeFormatterBuilder() .appendPattern("yyyy-MM-dd HH:mm:ss zZ") .toFormatter() .withLocale(Locale.GERMANY) val dateTime = dateTimeFormatter.parseDateTime(adjustedInput)
解决方案2:自定义解析器(更优雅,无需修改输入)
直接用DateTimeFormatterBuilder分别指定时区名称和偏移量的解析规则,让它支持无空格拼接的格式:
val formatter = DateTimeFormatterBuilder() .appendPattern("yyyy-MM-dd HH:mm:ss ") .appendZoneName() // 解析"CEST"部分 .appendOffset("+HHmm", "Z") // 解析"+0200"部分,支持无空格拼接 .toFormatter() .withLocale(Locale.GERMANY) val dateTime = formatter.parseDateTime("2019-05-10 18:45:00 CEST+0200")
额外提示
虽然Joda Time曾经是Java日期处理的标杆,但现在官方已经推荐迁移到Java 8+的java.time API(JSR-310),它对这种复杂时区格式的支持更灵活。不过如果必须继续使用Joda,上面的两种方案都能完美解决你的问题。
内容的提问来源于stack exchange,提问作者Anas.J
相关产品推荐
相关产品推荐

