Ändern der Zeitzone ohne änderung der Zeit in Java
Ich erhalte ein datetime aus einem SOAP webservice ohne timzone Informationen. Also, die Achse deserializer übernimmt UTC. Jedoch, die datetime ist wirklich in Sydney-Zeit. Ich habe das problem gelöst, indem der Subtraktion des timezone offset:
Calendar trade_date = trade.getTradeDateTime();
TimeZone est_tz = TimeZone.getTimeZone("Australia/Sydney");
long millis = trade_date.getTimeInMillis() - est_tz.getRawOffset();
trade_date.setTimeZone( est_tz );
trade_date.setTimeInMillis( millis );
Allerdings bin ich mir nicht sicher, ob diese Lösung nimmt auch die Sommerzeit berücksichtigt. Ich denke, das sollte es, denn alle Operationen sind auf UTC-Zeit. Alle Erfahrungen, die mit der Manipulation der Zeit in Java? Bessere Ideen, wie dieses problem zu lösen?
Ich habe immer, immer, und Bearbeiten Sie nur das Datum (in jeder Sprache), mit der einzigen Einheit, die fixiert ist. Diese Einheit ist die Sekunde (oder Millisekunde). Es sind nur wenige Minuten mit 59 oder 61 Sekunden und es gibt Tage mit 23 oder 25 Stunden. Es gibt Stunden mit 60*60 +/- 1 Sekunden, etc. Alle meine Termine gespeichert werden, (milli)Sekunden seit Beginn der Epoche zurück. Das ist, wie Sie in der DB, das ist, wie Sie sortiert sind. Der einzige Zeitpunkt, zu dem ich eine timezone/yyyy-mm-dd was Bekehrung ist, wenn es sein muss, das dem Benutzer angezeigt wird (oder wenn die mit der Defekten APIs, die nicht verstehen, dass ein Datum ist expressable in Sekunden).
Das ist die fundierte Beratung, aber OP ist eindeutig gepostet, dass er erhält den Zeitstempel von einem web-Dienst ( möglicherweise 3rd-party ) und verwendet ein 3rd-party-Bibliothek, um die Anforderung zu verarbeiten. Klar gibt es einige Dinge aus seiner direkten Kontrolle, und die Umwandlung von Zeitzone zu Zeitzone ist definitiv nicht geradlinig, mit java.util.Kalender.
Vielen Dank für Ihre Kommentare. Ich bin die Generierung der Web Service stubs aus der WSDL-Datei mit Achse. Ich bin mit den generierten Klassen für die Verbindung zu einem externen web-service. Ich eigentlich, was Sie vermitteln sollten datetime-Felder entweder mit Informationen zur Zeitzone oder in UTC, was die Achse erwartet wird. Aber das ist nicht meine Wahl.
Das ist die fundierte Beratung, aber OP ist eindeutig gepostet, dass er erhält den Zeitstempel von einem web-Dienst ( möglicherweise 3rd-party ) und verwendet ein 3rd-party-Bibliothek, um die Anforderung zu verarbeiten. Klar gibt es einige Dinge aus seiner direkten Kontrolle, und die Umwandlung von Zeitzone zu Zeitzone ist definitiv nicht geradlinig, mit java.util.Kalender.
Vielen Dank für Ihre Kommentare. Ich bin die Generierung der Web Service stubs aus der WSDL-Datei mit Achse. Ich bin mit den generierten Klassen für die Verbindung zu einem externen web-service. Ich eigentlich, was Sie vermitteln sollten datetime-Felder entweder mit Informationen zur Zeitzone oder in UTC, was die Achse erwartet wird. Aber das ist nicht meine Wahl.
InformationsquelleAutor | 2010-05-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe Mitleid mit der Narr, hat damit zu tun, Daten in Java.
Was Sie getan haben, wird mit ziemlicher Sicherheit schief gehen um die Sommerzeit übergänge. Der beste Weg, um zu es ist wahrscheinlich, um ein neues Kalenderobjekt erstellen, setzen Sie die Zeitzone auf Sie, und legen Sie dann alle Felder einzeln, also Jahr, Monat, Tag, Stunde, minute, Sekunde, um die Werte aus dem Date-Objekt.
Edit:
Zu halten die Menschen glücklich, Sie sollten wahrscheinlich tun Sie dies:
Dann werden Sie nicht mit irgendeiner veralteten Methoden.
wahrscheinlich:
newCalendar.set(oldCalendar.get(Calender.YEAR), oldCalendar.get(Calendar.MONTH),..., oldCalendar.get(Calendar.SECOND));
Pogrebnyak : ich habe aktualisiert die Antwort, so dass Benutzer nicht dazu führen, dass die dunkle Seite 😉
downvote entfernt.
InformationsquelleAutor Paul Wagland
Möchte ich danken, die person für die Rückmeldung 6. Dies war ein toller start für mich und ein Ansatz, den ich nicht berücksichtigen. Es gibt einige zusätzliche Schritte, die erforderlich sind, um es in Produktions-code-Ebene. Insbesondere beachten Sie die erforderlichen Schritte für DST_OFFSET und ZONE_OFFSET. Ich möchte die Lösung, die ich kam mit.
Dieser nimmt sich die Zeit, aus der input-Calendar-Objekt, kopiert es in den output-Zeit, legt die neue Zeitzone für die Ausgabe. Diese wird verwendet, wenn sich Zeit nehmen, buchstäblich aus der Datenbank und Einstellung der Zeitzone, ohne die Zeit zu verändern.
InformationsquelleAutor Mark Elliot
Ja, sollte man die Sommerzeit berücksichtigt, da es wirkt sich auf den offset zur UTC.
Joda-Time ist eine bessere Zeit-API. Vielleicht sind die folgenden snippet behilflich sein könnte :
JodaTime Arten sind unveränderlich, das ist auch ein Vorteil.
Joda-Time ist, lohnt sich die Mühe der Zugabe von einem Drittanbieter-Bibliothek. Gut getragen und haben sich bewährt. Die java.util.Datum & Kalender-Klassen sind notorisch lästig.
InformationsquelleAutor Timo Westkämper
Ich normalerweise Tue es auf diese Weise
InformationsquelleAutor razedk
Laufen CalendarTest
2016-06-30 19:09:16.522 +0300
1467302956522
2016-06-30 19:09:16.522 +0100
1467310156522
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.137 Sek
InformationsquelleAutor Olesia
Sind Sie immer ein ISO-8601-Stil-string aus, dass messed-up-Web-Service? Wenn ja, ist das Joda-Time 2.3 Bibliothek macht dies sehr einfach.
Wenn Sie eine ISO-8601-string ohne Zeitzonen-offset, übergeben Sie eine Zeitzone Objekt dem DateTime-Konstruktor.
Dump in die Konsole...
Beim laufen...
InformationsquelleAutor Basil Bourque
Habe ich mich dazu entschieden reparse das datetime-Zeichenfolge, die mit der richtigen Zeitzone eingestellt ist. Dies sollte auch berücksichtigen Sommerzeit:
InformationsquelleAutor