Ich trete empfehlen Chor, dass Sie die jetzt lange veraltete Klassen Date
, Calendar
, überspringen SimpleDateFormat
und Freunde. Insbesondere würde ich davor warnen, die veralteten Methoden und Konstruktoren der Klasse Date
wie den von Ihnen verwendeten Konstruktor Date(String)
zu verwenden. Sie wurden missbilligt, da sie nicht zuverlässig über Zeitzonen hinweg funktionieren. Verwenden Sie sie daher nicht. Und ja, die meisten Konstruktoren und Methoden dieser Klasse sind veraltet.
Während Sie die Frage gestellt haben, war Joda-Time (von allem was ich weiß) eine deutlich bessere Alternative, die Zeit hat sich wieder verschoben. Heute ist Joda-Time ein weitgehend abgeschlossenes Projekt, und seine Entwickler empfehlen stattdessen die Verwendung der modernen Java-API für Datum und Uhrzeit, java.time
. Ich werde dir zeigen, wie.
ZonedDateTime localTime = ZonedDateTime.now(ZoneId.systemDefault());
// Convert Local Time to UTC
OffsetDateTime gmtTime
= localTime.toOffsetDateTime().withOffsetSameInstant(ZoneOffset.UTC);
System.out.println("Local:" + localTime.toString()
+ " --> UTC time:" + gmtTime.toString());
// Reverse Convert UTC Time to Local time
localTime = gmtTime.atZoneSameInstant(ZoneId.systemDefault());
System.out.println("Local Time " + localTime.toString());
Für den Anfang, beachten Sie, dass nicht nur der Code ist nur halb so lang wie bei Ihnen, es habe auch gelesen, klarer zu.
Auf meinem Computer der Code druckt:
Local:2017-09-02T07:25:46.211+02:00[Europe/Berlin] --> UTC time:2017-09-02T05:25:46.211Z
Local Time 2017-09-02T07:25:46.211+02:00[Europe/Berlin]
verließ ich die Millisekunden seit Beginn der Epoche aus. Sie können sie immer von System.currentTimeMillis();
wie in Ihrer Frage erhalten, und sie sind unabhängig von der Zeitzone, so dass ich sie hier nicht interessant fand.
Ich zögerte zögernd Ihren Variablennamen localTime
. Ich denke, es ist ein guter Name. Die moderne API hat eine Klasse namens LocalTime
, daher kann die Verwendung dieses Namens, der nur nicht großgeschrieben wird, für ein Objekt, das nicht den Typ LocalTime
hat, einige verwirren (ein LocalTime
enthält keine Zeitzoneninformationen, die wir hier behalten müssen) in der Lage, die richtige Umwandlung zu machen, es hält auch nur die Uhrzeit, nicht das Datum).
Ihre Konvertierung von Ortszeit in UTC falsch und unmöglich war
Die veraltete Date
Klasse keine Zeitzoneninformationen nicht halten (man kann sagen, dass es intern UTC verwendet immer), so gibt es keine solche Ding wie ein Date
von einer Zeitzone in eine andere umwandeln. Wenn ich den Code auf meinem Computer gerade lief, die erste Zeile es gedruckt war:
Local:Sat Sep 02 07:25:45 CEST 2017,1504329945967 --> UTC time:Sat Sep 02 05:25:45 CEST 2017-1504322745000
07:25:45 CEST
korrekt ist, natürlich.Die korrekte UTC-Zeit wäre gewesen, aber es heißt wieder CEST
, was falsch ist.
Jetzt brauchen Sie nie wieder die Date
Klasse, aber wenn Sie jemals gehen würden, wäre das Lesen All about java.util.Date auf Jon Skeet Coding Blog.
Frage: Kann ich die moderne API mit meiner Java-Version verwenden?
Wenn Sie mindestens Java verwenden, können Sie.
- In Java 8 und höher ist die neue API integriert.
- In Java 6 und 7 erhalten the ThreeTen Backport, die Backport der neuen Klassen (das ist ThreeTen für JSR-310, wo die moderne API zuerst definiert wurde).
- Verwenden Sie auf Android die Android-Edition von ThreeTen Backport. Es heißt ThreeTenABP, und ich denke, dass es eine wunderbare Erklärung in this question: How to use ThreeTenABP in Android Project gibt.
Eine gute Antwort! Jedoch sollte statt TimeZone.getDefault(). GetOffset (localTime.getTime()) TimeZone.getDefault() sein. GetOffset (gmtTime.getTimeInMillis()). Andernfalls können Sie Probleme mit DaylightSaving haben, wenn Ihre UTC-Zeit im Winter ist, die Ortszeit jedoch im Sommer ist. – Dime
'neues Datum (Zeichenkette)' veraltet :( –
du bist ein Lebensretter T_T das ist die einzige Möglichkeit, den Konflikt von java.util.date (@temporal) und Zeitstempel (postgresql) von GMT vs UTC zu lösen – Sarief