没有时区的Avro源连接器中的“时间戳”字段

时间:2019-02-07 10:36:05

标签: datetime apache-kafka avro apache-kafka-connect

我有一个SQL DATETIME字段DT,我想使用Avro将其输入Kafka。 DT在当地时间,但没有时区;存储在另一列TZ中,以分钟为单位的UTC偏移量。似乎Avro timestamp-millis适用于DT,但由于缺乏时区,我对转换感到困惑。通过查看连接器源代码,我认为它将默认为UTC。

因此提出了以下问题:

  1. 是否将所有明显相似的日期时间转换为一个纪元以来的相同毫秒数,而不管它们的标称时区如何?例如,(2018-01-01T00:00Z).to_timestamp_ms() == (2018-01-01T00:00).to_timestamp_ms() == (2018-01-01T00:00+05).to_timestamp_ms()吗?

  2. 更重要的是,是否可以通过从日期时间字段TZ中减去时区偏移量DT(现在是现在),在摄取后转换为真正的UTC 从某个时代起以毫秒为单位)?换句话说,如果连接器错误地假定为UTC,并且错误地将日期时间解释为UTC,那么可以通过减去偏移量来恢复之后的真实日期时间吗?

有关转换步骤的详细信息

我认为连接器上的操作顺序是这样的(很大程度上超出了我的控制范围):

tz = read_field_as_int('tz')
dt = read_field_as_string('dt')
parsed_datetime = datetime(dt, timezone=UTC)
message = {
    'dt': parsed_datetime.to_timestamp_ms(),
    'tz': tz
}
producer.produce(message)

然后,在消费者中,这可能行得通吗?

ms_per_min = 60 * 1000
message = consumer.poll()
true_timestamp = message['dt'] - message['tz'] * ms_per_min
true_dt = datetime.from_timestamp(true_timestamp, timezone=UTC)

0 个答案:

没有答案