Wie konvertiert LocalDateTime zu com.google.protobuf.Timestamp?

Habe ich eine Instanz von LocalDateTime, die ich aus der repository-Schicht, und ich brauche, um Sie zu konvertieren, um einen Zeitstempel (Protocol Buffer) Instanz.

Habe ich verwendet folgenden Ansatz für die Umwandlung:

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();

Ist die ZoneOffset hier verwendet, um zu konvertieren, localDateTime, um eine Instanz, die eine Sofortige, richtige?

Benutzt habe ich den UTC-offset da der Kommentar auf die „Sekunden“ – Attribut in der Timestamp-Klasse-sagt der folgende:

Repräsentiert Sekunden der UTC-Zeit seit der Unix-Epoche 1970-01-01T00:00:00Z.
Muss aus 0001-01-01T00:00:00Z bis 9999-12-31T23:59:59Z inclusive

Habe ich den richtigen ZoneOffset und ist meine conversion-Ansatz richtig?

  • Ja, zone offset ist notwendig, um zu beheben eine LocalDateTime zu einem Instant. Der rest deiner Frage ist unklar. Der Teil nach „Weil“ scheint nicht angeschlossen zu dem Teil mit dem Fragezeichen. Bitte klären Sie.
  • Ich habe bearbeitet die Frage, bitte haben Sie einen Blick.
  • Wir können Ihnen nicht sagen, welche Zeitzone zu verwenden. Warum hat Ihr repository zurückgeben LocalDateTime statt einer Instant? Hoffentlich finden Sie heraus, in welcher Zeitzone die datetime ist relativ zu. Wenn es nicht dokumentiert überall, die datetime-ist wohl im server-lokalen Zeit (zurückgegeben von ZoneId.systemDefault()). Unter Berufung auf die system-Zeitzone ist eine unerwünschte Praxis, sondern die Menschen tun es die ganze Zeit trotzdem
InformationsquelleAutor uneq95 | 2018-06-07



One Reply
  1. 3

    Im Allgemeinen, Nein, dein Ansatz ist nicht korrekt. Der Grund dafür ist, dass ein LocalDateTime verfügt nicht über eine zugeordnete Zeitzone, also ist es nicht eindeutig von der Natur. Konvertieren Sie es zu einer tatsächlichen Zeitstempel (absolute Zeitpunkt, unabhängig von Zeitzonen), müssen Sie wissen, welche Zeitzone es wurde gemessen.

    Durch den Aufruf localDateTime.toInstant(ZoneOffset.UTC) Sie sind, vorausgesetzt, dass Ihr localDateTime war eigentlich, gemessen in der UTC-Zeitzone. Stattdessen sollten Sie die Zeitzone, die der LocalDateTime gespeichert ist. Wenn Sie nicht wissen, dann werden Ihre eingegebenen Daten ist inhärent mehrdeutig, und Sie müssen, um das zu beheben zuerst.

    Beachten Sie, dass dies nichts mit der Tatsache zu tun, dass der Unix-Epoche ist in der Regel angegeben in UTC. Wir könnten ebenso gut sagen, dass der Unix-Epoche ist 1970-01-01T08:00:00+08:00, und es wäre im selben Augenblick in der Zeit.

    Der rest scheint korrekt zu mir.

    • Danke für die Aufklärung, Thomas!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.