bugfix: getMicrosecondsSince1970FromDay was using localtime conversion #39
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes a timezone conversion bug in
getMicrosecondsSince1970FromDay():ISO 8601 UTC timestamps would be incorrectly converted when parsed and re-serialized.
This issue surfaces in the scenario:
parseISO8601TimeUTC()-> calls
getMicrosecondsSince1970FromDateTime()-> calls
getMicrosecondsSince1970FromDay()std::mktime()interprets thetmstructure as LOCAL TIME and converts it to UTC, but the function receives date/time components that are already in UTC (parsed from ISO 8601 strings with 'Z' suffix).This causes a double conversion:
I have added unit tests that demonstrate the issue.
4 "chrono" tests will fail without the fix.
With the fix:
92 | Chrono | ISO8601RoundTrip [ SUCCESS ]
93 | Chrono | LeapYear [ SUCCESS ]
94 | Chrono | MidnightBoundary [ SUCCESS ]
95 | Chrono | TimezoneIndependence [ SUCCESS ]
The fix aims to be valid also on windows, but this is not tested