我有一个SQL DATETIME字段DT
,我想使用Avro将其输入Kafka。 DT
在当地时间,但没有时区;存储在另一列TZ
中,以分钟为单位的UTC偏移量。似乎Avro timestamp-millis适用于DT
,但由于缺乏时区,我对转换感到困惑。通过查看连接器源代码,我认为它将默认为UTC。
因此提出了以下问题:
是否将所有明显相似的日期时间转换为一个纪元以来的相同毫秒数,而不管它们的标称时区如何?例如,(2018-01-01T00:00Z).to_timestamp_ms()
== (2018-01-01T00:00).to_timestamp_ms()
== (2018-01-01T00:00+05).to_timestamp_ms()
吗?
更重要的是,是否可以通过从日期时间字段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)