Поле метки времени в соединителе источника Avro без часового пояса - PullRequest
0 голосов
/ 07 февраля 2019

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