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
相关产品推荐
相关产品推荐

