2009-07-01 2 views

Antwort

84

Sie können zuerst eine Joda DateTime in eine lange (Millis seit der Epoche) konvertieren und dann daraus einen Timestamp erstellen.

DateTime dateTime = new DateTime(); 
Timestamp timeStamp = new Timestamp(dateTime.getMillis()); 
+6

Wo über die Time-Zone Komponente? Sie haben nur das Datum und die Uhrzeit "kopiert", aber nicht die Zeitzone, die den tatsächlichen Wert beeinflussen kann ... –

+5

Können Sie näher erläutern, was Sie meinen? dateTime.getMillis() gibt die Millisekunden seit der Epoche zurück, die die Zeitzone berücksichtigt. –

+6

Es ist erwähnenswert, dass joda-Zeit nicht Nanosekunden speichert, während Timestamp tut. Jede Umwandlung zwischen den beiden verliert die Genauigkeit im Nanosekundenbereich. – Gili

9

Der DateTime-Konstruktor von JodaTime kann dies jetzt für Sie erledigen. (Ich bin nicht sicher, ob das wahr ist, wenn die Frage gestellt wurde, aber es ist ein Top-Google-Ergebnis so dass ich dachte ich eine neuere Lösung hinzufügen würde.)

Es gibt ein paar API-Optionen:

public DateTime(Object instant); 
public DateTime(Object instant, DateTimeZone zone); 

Beide Optionen akzeptieren java.sql.Timestamp, weil es java.util.Date erweitert, aber die Nanosekunden werden ignoriert (floored), da DateTime und Date nur eine Millisekunden-Auflösung * haben. Ohne eine bestimmte Zeitzone wird standardmäßig DateTimeZone.UTC verwendet.

< Didactic Modus >
"Auflösung" ist, wie viele Stellen vorgesehen sind. "Präzision" ist, wie genau die Darstellung ist. Zum Beispiel hat MSSQLs DateTime eine Millisekunden-Auflösung, aber nur eine 1/3 Sekunde Genauigkeit (DateTime2 hat eine variable Auflösung und höhere Genauigkeit).
</Didactic Modus >

UTC-Zeitstempel mit Millisekundenauflösung Beispiel:

new DateTime(resultSet.getTimestamp(1)); 

Wenn Sie TIMESTAMP WITH TIME ZONE in Ihrer Datenbank verwenden, dann können Sie nicht java.sql.Timestamp verwenden, da Es unterstützt keine Zeitzonen. Sie müssen ResultSet # getString verwenden und die Zeichenfolge analysieren.

Zeitstempel ohne Zeitzone mit dem zweiten Auflösung Beispiel **:

LocalDateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss") 
    .parseLocalDateTime(resultSet.getString(1)); 

UTC-Zeitstempel mit dem zweiten Resolution Beispiel **:

DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss") 
    .parseDateTime(resultSet.getString(1)); 

Zeitstempel mit Zeitzone (Offset-Format) mit dem zweiten Auflösung Beispiel **:

DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss Z") 
    .parseDateTime(resultSet.getString(1)); 

Bonus: DateTimeFormat # forPattern statisch ally cachiert Parser nach Muster, so dass Sie nicht müssen.

< Didactic Modus >
Generell empfehle ich einen String in Ihrem DBO-Modell, um mit Auflösung expliziten und vermeiden Zwischen Objekte erzeugen, zu machen. (Ist 2013-11-14 09:55:25 gleich dem 2013-11-14 09: 55: 25.000?) Ich versuche generell zwischen "Datenbankmodellobjekten" zu unterscheiden, die für Datenerhaltsprobleme optimiert sind, und "Businessmodellobjekten", die für die Verwendung auf Serviceebene mit einer dazwischenliegenden Transformations-/Mappingschicht optimiert sind. Ich finde, CRUD-basierte DAOs, die Geschäftsobjekte generieren, tendieren dazu, die Prioritäten zu verwechseln und für beide zu optimieren, indem sie Ausnahmen von unerwarteten Stellen wegen fehlender Randfälle werfen. Wenn Sie über eine explizite Transformationsebene verfügen, können Sie bei Bedarf auch eine Validierung hinzufügen, z. B. wenn Sie die Datenquelle nicht steuern. Die Trennung der Bedenken erleichtert auch das unabhängige Testen jeder Schicht.
</Didactic Modus >

* Wenn Sie Nanosekunde Auflösung in Ihrem Geschäftsmodell noch auflösen müssen Sie eine andere Bibliothek verwenden müssen.

** Zeitstempel String-Format kann zwischen den Datenbanken variieren, nicht sicher.

+0

In Bezug auf Nanosekunden ... FYI, [JSR 310: Datum und Zeit API] (http://jcp.org/en/jsr/detail?id=310) in Java 8 und Joda-Time-Nachfolger gebaut wird, unterstützt tatsächlich Nanosekunden Auflösung. Denken Sie daran, dass die Uhrzeit vieler Computer keine Zeit für diese Granularität hat. Nebenbei: interessante Anmerkung aus der JSR-Spezifikation: * Diese Klassen verwenden Nanosekunden-Genauigkeit. Die Klassen haben eine ausreichende Genauigkeit, um jede Nanosekunde im aktuellen Zeitalter des Universums darzustellen. * –

+0

Ich wünschte, sie würden die Diktion in dieser Spezifikation korrigieren ... Java hat keine Kontrolle über die Präzision der Hardware, und Genauigkeit ist eine Funktion der Präzision und Richtigkeit (oder "Richtigkeit").Die Klassen haben eine Auflösung im Nanosekundenbereich und eine ausreichende Größe im Speicher, um eine sehr große Anzahl von Nanosekunden darzustellen. – KarlKFI

+0

Zu Ihrer Aussage über die Granularität: Einige Systeme haben keine Nanosekundenauflösung, und einige haben keine Nanosekundenpräzision oder -korrektheit. System.nanoTime() fügt wahrscheinlich Nullen auf jedem System hinzu, auf dem das Betriebssystem keine Nanosekundenauflösung bietet, aber das erhöht nur die Auflösung, nicht die Genauigkeit, Richtigkeit oder Genauigkeit. Hier ist die gründlichste Quelle, die ich über die Terminologie finden kann: http://www.tutelman.com/golf/measure/precision.php – KarlKFI