Как преобразовать LocalDateTime в com.гугл.протобуф.Метка времени?
У меня есть экземпляр LocalDateTime, который я получаю из слоя репозитория, и мне нужно преобразовать его в экземпляр Timestamp (Protocol Buffer).
Я использовал следующий подход для преобразования:
LocalDateTime localDateTime = LocalDateTime.now();//this can be any date
Instant instant = localDateTime.toInstant(ZoneOffset.UTC);
Timestamp timestamp = Timestamp.newBuilder()
.setSeconds(instant.getEpochSecond())
.setNanos(instant.getNano())
.build();
Используется ли здесь ZoneOffset для преобразования localDateTime в экземпляр Instant, правильно?
Я использовал смещение UTC, потому что комментарий к атрибуту "seconds" в классе Timestamp говорит следующее:
Представляет секунды UTC время с Unix эпохи 1970-01-01T00: 00: 00Z. Должно быть от 0001-01-01T00: 00: 00Z до 9999-12-31T23:59: 59Z включительно
Правильно ли я использовал ZoneOffset и корректен ли мой подход к преобразованию?
1 ответ:
В общем, нет, ваш подход неверен. Причина в том, что
LocalDateTime
не имеет связанного часового пояса, поэтому он неоднозначен по своей природе. Чтобы преобразовать его в фактическую временную метку (абсолютную точку времени, независимую от часовых поясов), вам нужно знать, в каком часовом поясе он был измерен.Вызывая
Обратите внимание, что это не имеет ничего общего с тем, что эпоха Unix обычно указывается в UTC. С таким же успехом мы могли бы сказать, что эпоха Unix-этоlocalDateTime.toInstant(ZoneOffset.UTC)
, Вы предполагаете, что вашlocalDateTime
был фактически измерен в часовом поясе UTC. вместо этого вы должны использовать часовой пояс, в котором хранитсяLocalDateTime
. Если вы не знаете, тогда ваши входные данные изначально неоднозначны, и вам нужно будет сначала исправить это.1970-01-01T08:00:00+08:00
, и это был бы тот же самый момент времени.Остальное кажется правильным для меня.