You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:22:56