Skip to content

fix: ISO8601 should take priority over yyyyMMddHHmmss in Instant write, for issue #4003#7632

Open
wenshao wants to merge 1 commit into
mainfrom
fix/issue-4003-instant-iso8601
Open

fix: ISO8601 should take priority over yyyyMMddHHmmss in Instant write, for issue #4003#7632
wenshao wants to merge 1 commit into
mainfrom
fix/issue-4003-instant-iso8601

Conversation

@wenshao

@wenshao wenshao commented Apr 25, 2026

Copy link
Copy Markdown
Member

Summary

  • When the JSONWriter.Context has dateFormat="iso8601" (the runtime form that fastjson1's SerializerFeature.UseISO8601DateFormat resolves into) ISO8601 must take priority over any string-pattern shape flags such as yyyyMMddhhmmss19/14/8/10.
  • Previously the codec evaluated those flags purely against the codec instance + context's pattern flags, so a setup that had been initialized with dateFormat="yyyy-MM-dd HH:mm:ss" and later switched to ISO8601 could still hit the yyyyMMddhhmmss19 path and produce "2026-02-24 14:50:00" instead of "2026-02-24T14:50:00Z".
  • Compute a single iso8601 effective flag and gate the yyyyMMddhhmmss shape paths on !iso8601, so an explicit ISO8601 request always wins.

Fixes #4003.

Test plan

  • New Issue4003 test covering: ISO8601 alone, ISO8601 after a default yyyy-MM-dd HH:mm:ss, default yyyy-MM-dd HH:mm:ss without ISO8601 (regression), and no-format default.
  • All *Instant*, *ISO8601*, *DateTimeCodec*, Issue* tests pass (37 tests).

…e, for issue #4003

When the JSONWriter.Context has dateFormat="iso8601" (the runtime form
that fastjson1's SerializerFeature.UseISO8601DateFormat resolves into)
ISO8601 must take priority over any string-pattern shape flags such as
yyyyMMddhhmmss19/14/8/10. Previously the codec evaluated those flags
purely against the codec instance + context's pattern flags, so a
configuration that had been set up with dateFormat="yyyy-MM-dd HH:mm:ss"
and later switched to ISO8601 could still hit the yyyyMMddhhmmss19 path
and produce "2026-02-24 14:50:00" instead of "2026-02-24T14:50:00Z".

Compute a single iso8601 effective flag and gate the yyyyMMddhhmmss
shape paths on !iso8601, so an explicit ISO8601 request always wins.
@CLAassistant

Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.


wenshao seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account.
You have signed the CLA already but the status is still pending? Let us recheck it.

@wenshao wenshao left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review via /qreview. 1 suggestion inline. Submitted as a Comment (not Approve / Request changes) because this is a self-authored PR and CI is still running.

}

@Test
public void testIso8601OverridesDefaultDateFormat() {

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] None of the four tests in this class fail without the production change — I ran Issue4003 against the base main version of ObjectWriterImplInstant.java and got Tests run: 4, Failures: 0, Errors: 0. The suite passes with or without the fix, so it does not actually guard the issue-4003 regression.

Root cause: Context.setDateFormat("iso8601") recomputes all shape flags in one shot — it sets dateFormatISO8601 = true and formatyyyyMMddhhmmss19 = false in the same call, and both flags are only ever assigned inside setDateFormat, so they are mutually exclusive. After ctx.setDateFormat("iso8601") the context is equivalent to new Context("iso8601"), and the old code already took the ISO8601 branch because yyyyMMddhhmmss19 was already false. The conflicting state this patch guards against (iso8601 true and a yyyyMMdd* flag true) is not reachable through setDateFormat.

To make this a real regression test it needs to reproduce the actual trigger and fail on main without this change. If the real-world report originates from SerializerFeature.UseISO8601DateFormat / a feature bit rather than setDateFormat("iso8601"), note that the iso8601 variable here only consults formatISO8601 and context.isDateFormatISO8601() — it never inspects a feature flag — so this patch may not cover that path either. Worth confirming how 4003 reproduces before relying on this fix.

— automated review via /qreview

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] 时间序列化的问题,在不同小版本之间序列化结果不一致!

2 participants