Поле метки времени в соединителе источника Avro без часового пояса

У меня есть поле SQL DATETIME DT что я хочу кормить в Кафку с помощью Avro. DT находится по местному времени, но не имеет часового пояса; это хранится в другом столбце TZ как смещение от UTC в минутах. Похоже, что отметка времени Avro будет подходить для 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)

0 ответов

Другие вопросы по тегам