Ich habe a java.util.Date
von a analysiert, String
aber es legt die lokale Zeitzone als Zeitzone des date
Objekts fest.
Die Zeitzone ist in der nicht angegeben String
, von dem Date
wird analysiert. Ich möchte eine bestimmte Zeitzone des date
Objekts festlegen .
Wie kann ich das machen?
java
date
timezone
java.util.date
Yatendra Goel
quelle
quelle
Antworten:
Verwenden Sie DateFormat. Beispielsweise,
quelle
TimeZone.setDefault()
vor dem AufrufgetTime()
tun, damit sich das neue Datumsobjekt in der gewünschten Zeitzone befindet . In JDK 1.8,Calendar.getTime()
fordertreturn new Date(getTimeInMillis());
.Beachten Sie, dass
java.util.Date
Objekte selbst keine Zeitzoneninformationen enthalten. Sie können die Zeitzone für einDate
Objekt nicht festlegen . Das einzige, was einDate
Objekt enthält, ist eine Anzahl von Millisekunden seit der "Epoche" - 1. Januar 1970, 00:00:00 UTC.Wie ZZ Coder zeigt, legen Sie die Zeitzone für das
DateFormat
Objekt fest, um anzugeben, in welcher Zeitzone Sie Datum und Uhrzeit anzeigen möchten.quelle
long
Feld namensfastTime
.Date.toString()
verwendet tatsächlich aCalendar
, um diese Millisekundenzeit zu interpretieren. WennDate
Sie also a ausdrucken, scheint es eine (Standard-) Zeitzone zu haben, was zu verständlichen Fragen zum Festlegen dieser Zeitzone führt.tl; dr
Keine Zeitzone in juDate
Wie in den anderen richtigen Antworten angegeben, hat ein java.util.Date keine Zeitzone † . Es repräsentiert UTC / GMT (kein Zeitzonenversatz). Sehr verwirrend, weil es
toString
Methode beim Generieren einer String-Darstellung die Standardzeitzone der JVM anwendet.Vermeiden Sie juDate
Aus diesem und vielen anderen Gründen sollten Sie die Verwendung von java.util.Date & .Calendar & java.text.SimpleDateFormat vermeiden. Sie sind notorisch lästig.
Verwenden Sie stattdessen das mit Java 8 gelieferte Paket java.time .
java.time
Die java.time-Klassen können einen Moment auf der Timeline auf drei Arten darstellen:
Instant
)OffsetDateTime
mitZoneOffset
)ZonedDateTime
mitZoneId
)Instant
In java.time ist der Grundbaustein
Instant
ein Moment auf der Zeitachse in UTC. Verwenden SieInstant
Objekte für einen Großteil Ihrer Geschäftslogik.OffsetDateTime
Tragen Sie eine Offset-von-UTC einzustellen in einige der Ortschaft Wandtaktzeit .
Bewerben Sie sich
ZoneOffset
, um eine zu erhaltenOffsetDateTime
.ZonedDateTime
Besser ist es, eine Zeitzone , einen Versatz sowie die Regeln für den Umgang mit Anomalien wie Sommerzeit (DST) anzuwenden .
Wenden Sie ein
ZoneId
auf einInstant
an, um ein zu erhaltenZonedDateTime
. Geben Sie immer einen richtigen Zeitzonennamen an . Verwenden Sie niemals 3-4 Abkürzungen wieEST
oderIST
, die weder eindeutig noch standardisiert sind.LocalDateTime
Wenn der Eingabezeichenfolge ein Indikator für Versatz oder Zone fehlte, analysieren Sie als
LocalDateTime
.Wenn Sie sich der beabsichtigten Zeitzone sicher sind, weisen Sie a
ZoneId
zu , um a zu erzeugenZonedDateTime
. Siehe Codebeispiel oben im Abschnitt tl; dr oben.Formatierte Zeichenfolgen
Rufen Sie die
toString
Methode für eine dieser drei Klassen auf, um eine Zeichenfolge zu generieren, die den Datums- / Uhrzeitwert im Standardformat ISO 8601 darstellt . DieZonedDateTime
Klasse erweitert das Standardformat, indem der Name der Zeitzone in Klammern angehängt wird.Verwenden Sie für andere Formate die
DateTimeFormatter
Klasse. Im Allgemeinen ist es am besten, diese Klasse lokalisierte Formate unter Verwendung der vom Benutzer erwarteten menschlichen Sprache und kulturellen Normen generieren zu lassen. Oder Sie können ein bestimmtes Format angeben.Über java.time
Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie
java.util.Date
,Calendar
, &SimpleDateFormat
.Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration auf java.time Klassen .
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für
java.sql.*
Klassen.Woher bekomme ich die java.time-Klassen?
Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden
Interval
,YearWeek
,YearQuarter
, und mehr .Joda-Zeit
Während Joda-Time noch aktiv gepflegt wird, haben uns die Macher angewiesen, so schnell wie möglich auf java.time zu migrieren. Ich lasse diesen Abschnitt als Referenz intakt, schlage aber vor, die zu verwenden
java.time
obigen Abschnitt zu verwenden.In Joda-Time
DateTime
kennt ein Datums- / Uhrzeitobjekt ( ) seine zugewiesene Zeitzone wirklich. Dies bedeutet einen Versatz von UTC und den Regeln und dem Verlauf der Sommerzeit (DST) dieser Zeitzone und anderer solcher Anomalien.Rufen Sie die
toString
Methode auf, um einen String im ISO 8601- Format zu generieren .Joda-Time bietet außerdem umfangreiche Funktionen zum Generieren aller Arten anderer String-Formate.
Bei Bedarf können Sie von Joda-Time DateTime in ein java.util.Date konvertieren.
Durchsuchen Sie StackOverflow nach "joda date", um viele weitere Beispiele zu finden, von denen einige recht detailliert sind.
† Tatsächlich ist in einer java.util.Date eine Zeitzone eingebettet, die für einige interne Funktionen verwendet wird (siehe Kommentare zu dieser Antwort). Diese interne Zeitzone ist jedoch nicht als Eigenschaft verfügbar und kann nicht festgelegt werden. Diese interne Zeitzone ist nicht die, durch die verwendete
toString
Methode in einer String - Darstellung des Datum-Zeit - Wert zu erzeugen; Stattdessen wird die aktuelle Standardzeitzone der JVM im laufenden Betrieb angewendet. Als Abkürzung sagen wir oft „juDate hat keine Zeitzone“. Verwirrend? Ja. Ein weiterer Grund, diese müden alten Klassen zu meiden.quelle
BaseCalendar.Date cdate
Eigenschaft gespeichert, falls festgelegt. Schauen Sie sich hier den Quellcode an . Sie können die Zeitzone eines juDate-Objekts nur festlegen, indem Sie die Standardzeitzone der JVM durch Aufrufen ändernTimeZone.setDefault(TimeZone.getTimeZone("NEW_TIME_ZONE"));
. Daher gibt es einen Zeitzonenversatz und Sie können den Versatz erhalten, indem Sie die veraltete Methode juDate.getTimezoneOffset ()toString
Methode, die die aktuelle Standardzeitzone der JVM anwendet. wieder die vergrabene Zeitzone ignorieren. Der Kürze halber sagen wir, dass ein java.util.Date keine Zeitzone hat. Wie Kunst ist es eine Lüge, die die Wahrheit sagt.TimeZone.setDefault
Sie nicht die Zeitzone des Objekts java.util.Date fest. Das Date-Objekt ignoriert weiterhin seine vergrabene Zeitzone und agiert effektiv in UTC. Sie würden dietoString
Methode von Date beeinflussen . Durch Festlegen der Standardeinstellung wird die Standardzeitzone der JVM geändert, die normalerweise auf die Zeitzone des Host-Betriebssystems festgelegt ist. Dieser Aufruf wird nicht empfohlen, da er den gesamten Code in allen Threads aller Apps betrifft, die in dieser JVM ausgeführt werden, und dies während der Ausführung im laufenden Betrieb. Da dieser Anruf unhöflich und gefährlich ist, sollte er nur als letzter Ausweg betrachtet werden.equals
,hashcode
,getTime
..) Wenn Sie einen Blick auf die nehmenequals
Methode, ruft siegetTime()
die AnrufegetTimeImpl()
, die Anrufe ,normalize()
wenn diecdate
Eigenschaft nicht normalisiert. Bei dernormalize()
Methode berechnet die letzte if-Bedingung die Millisekunden seit dem 1.1.70 basierend auf den gespeicherten Zeitzoneninformationen neu, wenn sich die Zeitzone voncdate
von der Zeitzone der aktuellen JVM-Umgebung unterscheidet, in der sie ausgeführt wird. (Schauen Sie sich ansun.util.calendar.AbstractCalendar getCalendarDate(long millis, CalendarDate date)
)Sie können die Zeitzone auch auf JVM-Ebene einstellen
Ausgabe:
quelle
TimeZone.setDefault
ist ziemlich drastisch, da es die gesamte JVM und alle anderen Objekte und Threads betrifft. In dieser Antwort finden Sie Details, einschließlich noch weiterer Komplikationen, wenn Sie mit einem SecurityManager arbeiten. Noch komplizierter: Dieses Verhalten hat sich in verschiedenen Java-Versionen geändert, wie in dieser Frage erläutert .Wenn Sie nur mit Standard-JDK-Klassen arbeiten müssen, können Sie Folgendes verwenden:
Gutschrift geht an diesen Beitrag .
quelle
java.util.Calendar
ist die übliche Methode, um Zeitzonen nur mit JDK-Klassen zu behandeln. Apache Commons bietet einige weitere Alternativen / Dienstprogramme, die hilfreich sein können. Die Notiz von Edit Spong erinnerte mich daran, dass ich wirklich gute Dinge über Joda-Time gehört habe (obwohl ich sie selbst nicht benutzt habe).quelle
Period
,Duration
undInterval
. Diese Spannen sind Vergleichsmethoden wiecontains
,abuts
,overlap
, undgap
. UndPeriodFormatterBuilder
kann beschreibende Sätze wie "15 Jahre und 8 Monate" erstellen.Konvertieren Sie das Datum in einen String und führen Sie dies mit SimpleDateFormat aus.
quelle
Wenn jemand dies jemals benötigt, wenn Sie eine
XMLGregorianCalendar
Zeitzone von UTC in Ihre aktuelle Zeitzone konvertieren müssen, müssen Sie lediglich die Zeitzone auf einstellen0
und dann anrufentoGregorianCalendar()
- es bleibt dieselbe Zeitzone, aber derDate
weiß, wie man sie konvertiert Ihre, damit Sie die Daten von dort erhalten können.Ergebnis:
quelle
Dieser Code war hilfreich in einer App, an der ich arbeite:
quelle