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

JSON-B(Yasson实现)解析ISO8601时间的时区疑问

为什么Yasson解析带Z和不带Z的ISO时间得到的Date对象一致?

这个问题其实戳中了JSON-B规范(以及Yasson实现)对日期时间字符串的默认解析规则,咱们来理清楚背后的逻辑:

首先,你用的Yasson是JSON-B的官方参考实现,它严格遵循JSON-B的规范。当你的Java类没有添加@JsonbDateFormat注解时,JSON-B会使用默认的日期时间解析策略:

  • 对于带Z的ISO 8601字符串(比如2020-03-19T06:42:42Z),它明确表示这是UTC时间,解析时直接转换成对应的UTC时间戳。
  • 对于不带时区信息的ISO 8601字符串(比如2020-03-19T06:42:42),JSON-B规范的默认行为就是将其视为UTC时间来解析。

这就是为什么你得到的两个Date对象完全一致的核心原因——两种字符串最终都被解析成了同一个UTC时间对应的毫秒数。

另外要注意:java.util.Date本身并不携带时区信息,它本质上只是一个表示从1970-01-01T00:00:00 UTC开始的毫秒数的数值。所以只要两个字符串解析后对应的毫秒数相同,Date对象就会相等。

如果你希望改变这种默认行为(比如把无时区的字符串当作本地时区处理),可以通过@JsonbDateFormat注解显式指定时区,举个例子:

import javax.json.bind.annotation.JsonbDateFormat;
import java.util.Date;

public class YourClass {
    @JsonbDateFormat(timezone = "Asia/Shanghai") // 指定为东八区
    private Date timestamp;

    // getter和setter省略
}

这时再解析2020-03-19T06:42:42,Yasson就会把它当作东八区的时间,转换成的Date对象就会和带Z的UTC时间产生差异了。

内容的提问来源于stack exchange,提问作者Marco Del Percio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 00:39:07