Apache flink Flink json序列化时区问题

Apache flink Flink json序列化时区问题,apache-flink,flink-streaming,flink-sql,Apache Flink,Flink Streaming,Flink Sql,我使用JsonRowSerializationSchema将Flink的行序列化为JSON。SQL时间戳序列化存在时区问题 val row = new Row(1) row.setField(0, new Timestamp(0)) val tableSchema = TableSchema .builder .field("c", DataTypes.TIMESTAMP(3).bridgedTo(classOf[Timestamp]))

我使用
JsonRowSerializationSchema
将Flink的行序列化为JSON。SQL时间戳序列化存在时区问题

  val row = new Row(1)
  row.setField(0, new Timestamp(0))

  val tableSchema = TableSchema
    .builder
    .field("c", DataTypes.TIMESTAMP(3).bridgedTo(classOf[Timestamp]))
    .build

  val serializer = JsonRowSerializationSchema.builder()
    .withTypeInfo(tableSchema.toRowType)
    .build()

  println(new String(serializer.serialize(row)))
{“c”:“1969-12-31T16:00:00Z”}

我看到它使用
PST
(本地时区)来解释时间戳,但随后输出
UTC
(请参见输出中的
Z

如果我执行
TimeZone.setDefault(TimeZone.getTimeZone(“UTC”))
,那么它将打印
{“c”:“1970-01-01T00:00:00Z”}
。我的时间戳是为UTC时间创建的,我希望Flink将它们解释为UTC

我正在检查Flink实现,下面两个方法正在运行

    private JsonNode convertLocalDateTime(ObjectMapper mapper, JsonNode reuse, Object object) {
        return mapper.getNodeFactory()
            .textNode(RFC3339_TIMESTAMP_FORMAT.format((LocalDateTime) object));
    }

    private JsonNode convertTimestamp(ObjectMapper mapper, JsonNode reuse, Object object) {
        Timestamp timestamp = (Timestamp) object;
        return convertLocalDateTime(mapper, reuse, timestamp.toLocalDateTime());
    }

看起来实现是硬编码的,有没有办法告诉Flink使用
UTC
而不更改系统时间?

java.sql.Timestamp非常有问题,因为它取决于时区。这就是为什么我们在新的Table/SQL类型系统中用新的
java.time.*
类替换它

我们建议所有Flink JVM都在UTC时区进行配置,以实现过时的实现

对于Table/SQL,我们使用新的
org.apache.flink.formats.json.JsonRowDataSerializationSchema
,但这适用于内部数据结构。我建议只复制
JsonRowSerializationSchema
的源代码,并根据需要实现该格式。或者直接使用Jackson库,这将完全避免处理
TypeInformation