У меня есть поле SQL DATETIME DT
, которое я хочу передать в Kafka с помощью Avro.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()
?
Более важно, возможно ли преобразовать в истинный UTC после приема путемвычитать смещение часового пояса TZ
из поля даты и времени DT
(которое сейчас в миллисекундах с некоторой эпохи)?Другими словами, если соединитель неверно принимает 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)