[alibaba/fastjson]<font dir="auto" style="vertical-align: inherit;"><font dir="auto" style="vertical-align: inherit;">LocalDateTime的序列化问题:Jdk8DateCodec代码逻辑解释

2025-10-28 239 views
8

项目中希望LocalDateTime转为long型时间戳,但是无论如何设置都无效,经追踪代码之后,发现可能有些逻辑问题,不知道是不是我理解得不对。

问题见下文代码中的注释中:

                if (format == null) {
                    if ((features & mask) != 0 || serializer.isEnabled(SerializerFeature.UseISO8601DateFormat)) {
                        format = formatter_iso8601_pattern;
                    } else {
                        int nano = dateTime.getNano();
                        if (nano == 0) {
                            format = formatter_iso8601_pattern;
                        } else if (nano % 1000000 == 0) {
                            format = formatter_iso8601_pattern_23;
                        } else {
                            format = formatter_iso8601_pattern_29;
                        }
                    }
                }

                // 我的问题在这里,经过上述过程后,foramt一定不为null,那后两个逻辑分支进不去呢
                if (format != null) {
                    write(out, dateTime, format);
                } else if (out.isEnabled(SerializerFeature.WriteDateUseDateFormat)) {
                    //使用固定格式转化时间
                    write(out, dateTime, JSON.DEFFAULT_DATE_FORMAT);
                } else {
                    out.writeLong(dateTime.atZone(JSON.defaultTimeZone.toZoneId()).toInstant().toEpochMilli());
                }

代码段

回答

6

LocalDateTime是不含时区信息的,无法无歧义的转换成long的

9

如果需要使用,可以使用ZonedDateTime 并指定format="unixtime", 这个特性在https://github.com/alibaba/fastjson/pull/2491 中提交,参考测试代码Jdk8TimeFormatTest.java

@JSONField(format = "unixtime")
private ZonedDateTime time9;
9

感谢回复并提供方案。