Java Konvertieren GMT/UTC in die Lokale Zeit funktioniert nicht wie erwartet
Ist, um eine reproduzierbare Szenario, mache ich die folgenden
- Holen Sie sich die aktuelle Systemzeit (lokale Zeit)
- Konvertieren Lokale Zeit zu UTC //Funktioniert Bis hier
- Rückseite der UTC-Zeit, zurück in die lokale Zeit. Gefolgt 3 verschiedene Ansätze (siehe unten) aber alle 3 Ansätze behält die Zeit in UTC nur.
{
long ts = System.currentTimeMillis(); Date localTime = new Date(ts); String format = "yyyy/MM/dd HH:mm:ss"; SimpleDateFormat sdf = new SimpleDateFormat (format); //Convert Local Time to UTC (Works Fine) sdf.setTimeZone(TimeZone.getTimeZone("UTC")); Date gmtTime = new Date(sdf.format(localTime)); System.out.println("Local:" + localTime.toString() + "," + localTime.getTime() + " --> UTC time:" + gmtTime.toString() + "-" + gmtTime.getTime()); //Reverse Convert UTC Time to Locale time (Doesn't work) Approach 1 sdf.setTimeZone(TimeZone.getDefault()); localTime = new Date(sdf.format(gmtTime)); System.out.println("Local:" + localTime.toString() + "," + localTime.getTime() + " --> UTC time:" + gmtTime.toString() + "-" + gmtTime.getTime()); //Reverse Convert UTC Time to Locale time (Doesn't work) Approach 2 using DateFormat DateFormat df = new SimpleDateFormat (format); df.setTimeZone(TimeZone.getDefault()); localTime = df.parse((df.format(gmtTime))); System.out.println("Local:" + localTime.toString() + "," + localTime.getTime() + " --> UTC time:" + gmtTime.toString() + "-" + gmtTime.getTime()); //Approach 3 Calendar c = new GregorianCalendar(TimeZone.getDefault()); c.setTimeInMillis(gmtTime.getTime()); System.out.println("Local Time " + c.toString());
}
InformationsquelleAutor der Frage Vinod Jayachandran | 2013-10-15
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich empfehle auch die Verwendung Joda wie bereits erwähnt.
Lösung Ihres Problems mit standard - Java
Date
Objekte nur kann das wie folgt getan werden:Ausgabe:
InformationsquelleAutor der Antwort trylimits
Joda-Time
UPDATE: Die Joda-Time Projekt ist jetzt in Wartungsmodusmit dem team beraten migration auf die java.Zeit Klassen. Sehen Das Tutorial von Oracle.
Sehen meine andere Antwort mit der Industrie-führenden java.Zeit Klassen.
Normalerweise betrachten wir es als schlechte form auf StackOverflow.com die Antwort auf eine bestimmte Frage, die auf eine Alternative Technologie. Aber in dem Fall das Datum, die Uhrzeit und der Kalender-Klassen gebündelt mit Java 7 und früher, diese Klassen sind so notorisch schlecht im design und in der Ausführung, dass ich dazu gezwungen werde, zu empfehlen, ein 3rd-party-Bibliothek statt: Joda-Time.
Joda-Time funktioniert, indem immutable Objekte. Also anstatt ändern Sie die Zeitzone des DateTime-Objekts, werden wir einfach instanziieren Sie ein neues DateTime-mit einer anderen Zeitzone zugeordnet.
Ihrer zentralen Anliegen ist, die Verwendung lokaler und UTC-Zeit ist so sehr einfach im Joda-Time, wobei nur 3 Zeilen code.
Ausgegeben, wenn der run auf die west-Küste von Nordamerika sein könnte:
Local time in ISO 8601 format: 2013-10-15T02:45:30.801-07:00
UTC (Zulu) time zone: 2013-10-15T09:45:30.801Z
Hier ist eine Klasse mit vielen Beispielen und weitere Kommentare. Mit Joda-Time-2.5.
InformationsquelleAutor der Antwort Basil Bourque
Ich mich in den Chor der Empfehlung, Sie überspringen die jetzt lange veraltete Klassen
Date
Calendar
SimpleDateFormat
und Freunde. Vor allem würde ich warnen, gegen die Verwendung des veralteten Methoden und Konstruktoren derDate
Klasse, wie dieDate(String)
constructor verwendet. Sie waren veraltet, weil Sie nicht zuverlässig arbeiten über Zeitzonen hinweg, so verwenden Sie Sie nicht. Und ja, die meisten Konstruktoren und Methoden dieser Klasse sind veraltet.Während der Zeit, die Sie die Frage gestellt, Joda-Time war (von allen, die ich kenne) eine deutlich bessere alternative, die Zeit schon weiter. Heute Joda-Time ist ein weitgehend abgeschlossenes Projekt, und die Entwickler empfehlen die Verwendung
java.time
die moderne Java-Datums-und Zeit-API, statt. Ich werde Ihnen zeigen, wie.Für den Anfang, beachten Sie, dass nicht nur der code, der nur halb so lang wie deins, es ist auch übersichtlicher zu Lesen.
Auf meinem computer die code druckt:
Ließ ich die Millisekunden seit Beginn der Epoche zurück. Man kann immer bekommen Sie von
System.currentTimeMillis();
wie in Ihrer Frage, und Sie sind unabhängig von der Zeitzone, so dass ich nicht finde Sie sehr interessant hier.Ich zaghaft hielt Sie Ihre variable name
localTime
. Ich denke, es ist ein guter name. Die moderne API hat eine Klasse namensLocalTime
so ist dieser name nur nicht aktiviert, für ein Objekt, das nicht bekommen hat, geben SieLocalTime
könnte etwas verwirren (eineLocalTime
nicht hold time zone-Informationen, die wir benötigen, um zu halten Sie hier, um der Lage sein, um die richtige Konvertierung; es enthält nur die Uhrzeit, nicht das Datum).Ihre Konvertierung von Ortszeit in UTC-war falsch und unmöglich
Veraltete
Date
Klasse nicht halten keine Informationen zur Zeitzone (Sie können sagen, dass es intern verwendet immer UTC), also gibt es keine solche Sache wie die Konvertierung einerDate
von einer Zeitzone zu einer anderen. Wenn ich lief nur Ihren code auf meinem computer, die erste Zeile gedruckt, war:07:25:45 CEST
ist richtig, natürlich. Die korrekte UTC-Zeit gewesen wäre05:25:45 UTC
aber es sagtCEST
wieder, was falsch ist.Jetzt werden Sie nie brauchen die
Date
Klasse wieder 🙂 aber wenn Sie jemals, die man gelesen haben muss, wäre Alles über java.util.Datum auf Jon Skeet ' s coding blog.Frage: Kann ich die modernen API mit meiner Java version?
Wenn mindestens Java 6können Sie.
InformationsquelleAutor der Antwort Ole V.V.
Habe ich dringend empfohlen, Joda Time http://joda-time.sourceforge.net/faq.html
InformationsquelleAutor der Antwort Tomasz Waszczyk
Du hast ein date mit einer bekannten timezone (Hier
Europe/Madrid
) und ein Ziel-Zeitzone (UTC
)Brauchen Sie nur zwei SimpleDateFormats:
So nach und nach sehen, es funktioniert können Sie diese Methode, um Ihre utils:
InformationsquelleAutor der Antwort albfan
tl;dr
java.Zeit
Den modernen Ansatz nutzt die java.Zeit Klassen, verdrängte den lästigen alten legacy-Datum-Zeit-Klassen (
Date
,Calendar
usw.).Ihre Verwendung des Wortes "lokal" widerspricht der Nutzung in der java.Zeit Klasse. In java.Zeit"lokal" heißt alle Lokalität oder alle Ortschaften, aber nicht jedem einem bestimmten Ort. Die java.Zeit Klassen mit Namen beginnend mit "Local..." fehlt jede Vorstellung von Zeit zone oder offset von UTC. Also tun Sie nicht repräsentieren einen bestimmten moment, werden Sie nicht einen Punkt auf der Zeitleiste, in der Erwägung, dass Ihre Frage alles über Momente, die Punkte auf der Zeitachse, die man durch verschiedene Wand-Uhr-Zeiten.
Wenn Sie erfassen möchten der aktuelle Zeitpunkt in UTC, zu verwenden
Instant
. DieInstant
Klasse repräsentiert einen moment auf der Zeitachse, UTC mit einer Auflösung von Nanosekunden (bis zu neun (9) Ziffern eines dezimalbruchs).Passen in einen Zeit-zone durch die Anwendung einer
ZoneId
zu bekommenZonedDateTime
. Derselbe moment, derselbe Punkt auf der timeline, die verschiedene Wand-Uhr-Zeit.Angeben die richtige Zeit zone name im format
continent/region
wieAmerika/Montreal
Africa/Casablanca
oderPacific/Auckland
. Verwenden Sie niemals die 3-4 Buchstaben-Abkürzung wieEST
oderIST
wie Sie sind nicht wahr, Zeitzonen, nicht standardisierten und nicht sogar einzigartig(!).Als eine Verknüpfung, können Sie überspringen die Verwendung von
Instant
zu bekommenZonedDateTime
.Können Sie einstellen, aus der Zonen-Datum-Zeit in UTC, die durch extrahieren einer
Instant
aus einerZonedDateTime
.Wie oben gezeigt, gilt eine
ZoneId
anpassen selben moment in eine andere Wand-Uhr-Zeit verwendet, von den Menschen in einer bestimmten region (Zeitzone).Zurück zu UTC aus einer Zonen-Datum,-Zeit, rufen Sie
ZonedDateTime::toInstant
. Denken Sie konzeptionell wie: ZonedDateTime = Instant + amp; zoneid.Alle diese Objekte, die
Instant
und die dreiZonedDateTime
alle Objekte repräsentieren die gleichen gleichzeitiger moment, den gleichen Punkt in der Geschichte.Vergessen zu versuchen, zu beheben code mit dieser schrecklichen
Date
Calendar
undGregorianCalendar
Klassen. Sie sind ein elender Schlamassel bad-design und-Mängel. Sie müssen nie berühren Sie wieder. Wenn Sie müssen-Schnittstelle mit dem alten code noch nicht aktualisiert java.Zeitkönnen Sie wandeln hin und her, durch neue Konvertierungs-Methoden Hinzugefügt, um die alten Klassen.Über java.Zeit
Den java.Zeit framework ist in Java 8 und höher. Diese Klassen verdrängen die lästige alte Vermächtnis Datum-Zeit-Klassen wie
java.util.Date
Calendar
&" = SimpleDateFormat
.Den Joda-Time Projekt, jetzt in Wartungsmodusrät der migration auf die java.Zeit Klassen.
Um mehr zu erfahren, siehe die Oracle Tutorial. Und die Suche Stack Overflow für viele Beispiele und Erklärungen. Spezifikation JSR 310.
Können Sie exchange java.Zeit Objekte direkt mit Ihrer Datenbank. Verwenden Sie eine JDBC-Treiber kompatibel mit JDBC 4.2 oder später. Keine Notwendigkeit für Streicher, keine Notwendigkeit für
java.sql.*
Klassen.Wo erhalten Sie die java.Zeit-Klassen?
Den ThreeTen-Extra Projekt erweitert die java.mal mit zusätzlicher Klassen. Dieses Projekt ist ein Testgelände für mögliche künftige Erweiterungen zu java.Zeit. Sie finden möglicherweise einige nützliche Klassen, die hier wie
Interval
YearWeek
YearQuarter
und mehr.InformationsquelleAutor der Antwort Basil Bourque