Die Umwandlung von UTC in Anbetracht der Sommerzeit
Ich habe ein Datum, z.B. do. 17. April 09:03:01 GMT 2014 in der Zeitzone:
sun.util.calendar.ZoneInfo[id="Europe/London",offset=0,dstSavings=3600000,useDaylight=true,transitions=242,lastRule=java.util.SimpleTimeZone[id=Europe/London,offset=0,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]]
und jedesmal zu versuchen, um zu konvertieren UTC-es gibt do 17. April 10:03:01 GMT 2014
Dies ist jedoch nicht sinnvoll, da die entsprechenden UTC-Zeit ist eigentlich do 17. April 08:03:01 GMT 2014 da, dass das in meiner Zeitzone der Zeit Hinzugefügt wird, die 1 Stunde wegen der Sommerzeit.
Den code, den ich verwenden, um zu konvertieren, ist dies:
//timeZone - id="Europe/London"
public static Date timeZoneConvertDate(Date date, TimeZone timeZone) {
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.setTimeZone(timeZone);
sdf.applyPattern("dd-MM-yyyy HH:mm:ss");
String newDate = sdf.format(date);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
try {
Date nd = sdf.parse(newDate);
return nd;
} catch (ParseException e) {
return null;
}
}
Könnte mir jemand erklären, was ich falsch mache?
- Es ist nicht eine gute Praxis, zu konvertieren eines Objekts in eine Zeichenkette und dann analysieren es zu konvertieren zurück. Würde ich die joda-time-Bibliothek, die für eine solche Umwandlung: joda.org/joda-time
- es war mein Fehler, ich habe bereits eine Korrektur auf die Frage
Du musst angemeldet sein, um einen Kommentar abzugeben.
tl;dr
Einen
Date
hat keine Zeitzone zugeordnet, so dass Sie können nicht erstellen Sie eine Methode, die passt, die Zeitzone der date-Objekts. Sie müssen die Arbeit mitCalendar
wenn die Objekte, die Sie behalten wollen, TZ-Informationen oder, vorzugsweise, werfen Sie einen Blick auf Joda-Time.Erklärung Ihren Ausgang
Einen
Date
Wert hat keine Zeitzone Informationen; es ist lediglich die Anzahl der Millisekunden seit Beginn der Epoche zurück. Mit dem im Verstand, lassen Sie uns sehen, was du tust:Diesem Teil des Codes schafft einen Formatierer, der druckt das Datum in die London timezone. Also das Ergebnis bekommst du in der Zeit zu schreiben, ist in etwa:
17-04-2014 11:38:15
(vorausgesetzt, dass Sie gerade Ihr date-Objekt).Hier muss man sagen, die Datums-parser zu Lesen das Datum, als wäre es ein UTC-Datum. Es verwendet diese Informationen, um zu wissen, wie viele Millisekunden seit Beginn der Epoche bestanden haben. Das date-Objekt Sie erhalten, zurück hat noch keine Zeitzone zugeordnet.
UTC wird eine Stunde hinter British Summer Time, also es wird ein date-Objekt, das angezeigt wird eine Stunde Voraus, wenn Sie gedruckt in der Zeitzone BST. Also, wenn ich drucken
nd
ich bekommen:Thu Apr 17 12:38:15 BST 2014
.Date
repräsentiert einen einzelnen moment in der Zeit, ohne jede Zeitzone. Wenn Sie möchten, auf anzeigen ein Datum Wert in einer bestimmten Zeitzone (als eine Zeichenkette) verwendenSimpleDateFormat
wie in den ersten vier Zeilen der Methode.Keine Zeit-Zone In java.util.Datum
Als richtige Antwort von Duncan, sagte java.util.Datum, keine Zeitzone Komponente. Verwirrend sein
toString
Methode gilt die JVM die default-Zeitzone. Für die Anzeige in einer anderen Zeitzone verwenden " = SimpleDateFormat zum anwenden einer Einstellung.Sogar besser, zu vermeiden, die notorisch lästig java.util.Datum, .Kalender und " = SimpleDateFormat. Verwenden Sie entweder Joda-Time oder das neue java.time package in Java 8.
Joda-Time
In der Joda-Time -, DateTime-Objekt wirklich enthalten sind, die eine zugewiesene Zeitzone. Wenn Sie nicht geben Sie eine Zeitzone, die JVM die default-Zeitzone zugeordnet ist.
Beim laufen...
Können Sie leicht umwandeln und zurück zu java.util.Datum.
...und...