Skip to content

Timestamp: convert epoch milliseconds in the proleptic Gregorian calendar - #1165

Open
lenamonj wants to merge 1 commit into
amazon-ion:masterfrom
lenamonj:timestamp-proleptic-gregorian
Open

Timestamp: convert epoch milliseconds in the proleptic Gregorian calendar#1165
lenamonj wants to merge 1 commit into
amazon-ion:masterfrom
lenamonj:timestamp-proleptic-gregorian

Conversation

@lenamonj

@lenamonj lenamonj commented Sep 6, 2026

Copy link
Copy Markdown

Issue #, if available: #165

Description of changes:

Timestamp validates day-of-month with proleptic Gregorian leap rules but converted to and from epoch milliseconds through java.util.Date, which applies the Julian calendar before 1582-10-15. 1582-10-05T00:00:00Z and 1582-10-15T00:00:00Z shared one epoch millisecond, so compareTo called them equal while equals did not, and every earlier date denoted an instant days away from its text.

Both directions now use exact proleptic Gregorian day arithmetic with no Calendar allocated, the strategy #165 asked for after the Calendar-backed attempt was reverted for heap usage. getMillis() changes only before 1582-10-15. Two test expectations that encoded the Julian value are corrected, and a new test pins the cutover dates as distinct instants; it fails on master. ./gradlew build passes.

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

…ndar

Timestamp validated day-of-month with proleptic Gregorian leap rules but
converted to and from epoch milliseconds through java.util.Date, which
applies the Julian calendar before 1582-10-15. 1582-10-05T00:00:00Z and
1582-10-15T00:00:00Z shared one epoch millisecond, so compareTo called
them equal while equals did not, and every earlier date denoted an
instant days away from the one its text names (amazon-ion#165).

Both directions now use exact proleptic Gregorian day arithmetic, with
no Calendar allocated, which is the strategy amazon-ion#165 asked for after the
Calendar-backed attempt was reverted for heap usage. calendarValue()
moves the Julian cutover out of range so its fields agree. Two existing
expectations encoded the Julian value and are corrected; a new test pins
the cutover dates as distinct instants.
@lenamonj
lenamonj force-pushed the timestamp-proleptic-gregorian branch from 1c3b971 to de78754 Compare September 6, 2026 09:15
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.

1 participant