Как преобразовать 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 2

1 ответ:

В общем, нет, ваш подход неверен. Причина в том, что LocalDateTime не имеет связанного часового пояса, поэтому он неоднозначен по своей природе. Чтобы преобразовать его в фактическую временную метку (абсолютную точку времени, независимую от часовых поясов), вам нужно знать, в каком часовом поясе он был измерен.

Вызывая localDateTime.toInstant(ZoneOffset.UTC), Вы предполагаете, что ваш localDateTime был фактически измерен в часовом поясе UTC. вместо этого вы должны использовать часовой пояс, в котором хранится LocalDateTime. Если вы не знаете, тогда ваши входные данные изначально неоднозначны, и вам нужно будет сначала исправить это.

Обратите внимание, что это не имеет ничего общего с тем, что эпоха Unix обычно указывается в UTC. С таким же успехом мы могли бы сказать, что эпоха Unix-это 1970-01-01T08:00:00+08:00, и это был бы тот же самый момент времени.

Остальное кажется правильным для меня.