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