Serializer::serialize - malformed ISO 8601 timestamps with sub-second precision.
Two bugs in the nanosecond timestamp formatting path:
-
'%Y-%m-%dT%H:%M:%S.%%d%z'-%%din a strftime format string produces the literal two characters%d, not a formatted value. The resulting timestamp contained a literal%dsubstring. -
$data .= sprintf '.%03d', $nanosecondswas appended after%z(the timezone offset), producing2026-03-25T15:23:05+0000.891instead of the correct2026-03-25T15:23:05.891+0000.
Fixed by splitting the strftime call so fractional seconds are inserted before the timezone:
$data = strftime( '%Y-%m-%dT%H:%M:%S', localtime $epoch );
$data .= sprintf '.%03d', $nanoseconds;
$data .= strftime( '%z', localtime $epoch );This affected any AWS API response that includes a timestamp shape
with sub-second precision - notably ECR imagePushedAt, Lambda
LastModified, and CloudWatch event timestamps.
Release notes for 2.2.1 added retroactively to
release-notes/release-notes-2.2.1.md. Previous release notes
files relocated from project root into release-notes/ subdirectory.
release-notes.md symlink added pointing to current release.
See release-notes/release-notes-2.2.1.md.