Ramin Gharib created FLINK-40792:
------------------------------------

             Summary: Emit "Z" instead of "+00:00" for UTC in Variant.toJson()
                 Key: FLINK-40792
                 URL: https://issues.apache.org/jira/browse/FLINK-40792
             Project: Flink
          Issue Type: Improvement
          Components: API / Core
            Reporter: Ramin Gharib
            Assignee: Ramin Gharib


Variant.toJson() renders TIMESTAMP_LTZ and TIMESTAMP_LTZ_NS values as an ISO 
8601 timestamp with a numeric UTC offset. For a value at UTC, the offset is 
printed as +00:00.

Current output:
{code}
"1970-01-01T00:00:00+00:00"
"1970-01-01T00:00:00.123456789+00:00"
{code}

The formatter lives in 
[BinaryVariantUtil|https://github.com/apache/flink/blob/b25e303d5353e9e1a252712e746eb1b372df5729/flink-core/src/main/java/org/apache/flink/types/variant/BinaryVariantUtil.java#L235-L239]:
{code:java}
public static final DateTimeFormatter TIMESTAMP_LTZ_FORMATTER =
        new DateTimeFormatterBuilder()
                .append(TIMESTAMP_FORMATTER)
                .appendOffset("+HH:MM", "+00:00")
                .toFormatter(Locale.US);
{code}

h3. Proposed change

Emit \{{Z}} for the zero offset instead. The change is one line, setting the 
"no offset" text to \{{Z}}:
{code:java}
.appendOffset("+HH:MM", "Z")
{code}

Proposed output:
{code}
"1970-01-01T00:00:00Z"
"1970-01-01T00:00:00.123456789Z"
{code}

Only the zero offset changes, from \{{+00:00}} to \{{Z}}.

h3. Why

It is the canonical form for UTC. RFC 3339 and ISO 8601 both define \{{Z}} as 
the marker for UTC. It is the form most readers expect for a "Zulu time" 
timestamp.

It matches standard tooling. \{{Instant.toString()}}, 
\{{DateTimeFormatter.ISO_OFFSET_DATE_TIME}}, Jackson, and most JSON libraries 
emit \{{Z}} for UTC. Consumers parsing our output with a standard library 
round-trip more cleanly.

It is more compact. \{{Z}} is one character versus six.

The blast radius is small right now. VARIANT is new in Flink 2.x. Aligning the 
format before it is widely depended on is cheaper than changing it later.

h3. Compatibility

This is a behavior change to a public string output. Anyone doing string 
equality on \{{toJson()}} for a UTC \{{TIMESTAMP_LTZ}} value will see a diff. 
Should be documented as a behavior change with a release note.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to