Make sure SimpleDateFormat is set to UTC timezone #468
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.
📋 Changes
After spending quite some time trying to understand why our access tokens would not be refreshed, I realized that something was wrong with the
expiresAt
field. The issue affects (at least) Android because the UTC timezone is added in the format while the formatter itself is timezone-unaware.With the following added print statements, you can observe that the
Credentials.expiresAt
is formatted from local time with an appended Z, which means we lose the timezone information.Making sure all
SimpleDateFormat
are set to the UTC timezone fixes the issue, but sincejava.util.Date
is notably confusing to work with, a better fix would maybe be to usejava.time.Instant
(see alternative PR #469) and either call.toInstant().toString()
everywhere (andInstant.parse()
) which always work with ISO-8601 representation.📎 References
🎯 Testing
Print the
expiresAt
date in Flutter with and without this patch. This unit tests didn't catch this problem because the test had the same implementation issue.