Beste Weg, um zu extrahieren TimeZone-Objekt aus einem String?
Habe ich ein Datenbank-Feld enthält eine raw-Feld Datum (gespeichert als character data"), wie
Freitag, September 26, 2008 8:30 PM Eastern Daylight Time
Ich analysieren kann dies als ein Datum einfach mit " = SimpleDateFormat
DateFormat dbFormatter = new SimpleDateFormat("EEEE, MMMM dd, yyyy hh:mm aa zzzz");
Date scheduledDate = dbFormatter.parse(rawDate);
Was ich tun möchte ist, extrahieren Sie eine TimeZone-Objekt aus diesem string. Die Standard-Zeitzone in der JVM, dass diese Anwendung läuft, GMT, also kann ich nicht verwenden .getTimezoneOffset()
von der Date
analysiert vor (weil es wird wieder die default-TimeZone).
Neben der tokenisierung die raw-string-und die Suche nach der start-position der Timezone-string (da ich weiß, das format wird immer EEEE, MMMM dd, yyyy hh:mm aa zzzz
) gibt es eine Möglichkeit mit Hilfe der DateFormat - /" = SimpleDateFormat/Datum/Kalender-API extrahieren-ein TimeZone-Objekt - die haben die gleiche Zeitzone als String habe ich analysiert, auseinander mit DateFormat.parse()
?
Eine Sache, die nervt mich über Date
vs Calendar
in der Java-API ist, dass Calendar
ersetzen soll Date
an allen Orten... aber dann entschieden Sie sich, oh, hey, lasst uns noch nutzen Date
's in der DateFormat
Klassen.
- haben u got Lösung für dieses Problem?
- In Bezug auf den letzten Absatz, der
Date
&Calendar
Klassen sind eine blutige Masse: schlecht konzipiert, verwirrend und lästig. Um Sie zu vermeiden. Verwenden Sie die java.Zeit Klassen statt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich, dass die folgenden:
Produziert die folgenden:
Ich eigentlich fand, dass dies etwas überraschend. Aber, ich denke, das zeigt, dass die Antwort auf Ihre Frage ist, rufen Sie einfach getTimeZone auf der formatter nach haben Sie analysiert.
Bearbeiten:
Die oben ausgeführt wurde mit Sun ' s JDK 1.6.
@Ed Thomas:
Habe ich versucht, etwas sehr ähnlich zu Ihrem Beispiel, und ich bekomme sehr unterschiedliche Ergebnisse:
Ausgabe:
Scheint, wie
DateFormat.getTimeZone()
gibt die gleiche Zeitzone vor und nach derparse()
... auch wenn ich dazu eine explizitesetTimeZone()
vor dem Aufrufparse()
.Blick auf die Quelle für " = SimpleDateFormat DateFormat und, scheint, wie
getTimeZone()
nur gibt die Zeitzone der zugrunde liegende Kalender..., die standardmäßig zum Kalender der Standard-Locale/TimeZone, es sei denn, Sie geben eine bestimmte an.Empfehle ich Check-out die Joda Time-Datum und Zeit-API. Ich habe vor kurzem umgebaut worden zu einem Gläubigen, wie es neigt dazu, sehr überlegen die integrierte Unterstützung für Datums-und Zeitangaben in Java. Insbesondere sollten Sie sich über die DateTimeZone Klasse. Hoffe, das hilft.
http://joda-time.sourceforge.net/
http://joda-time.sourceforge.net/api-release/index.html
tl;dr
java.Zeit
Die moderne Art, die mit der java.Zeit-Klassen. Die Frage und andere Antworten verwenden Sie den lästigen alten legacy-Datum-Zeit-Klassen oder die Joda-Time-Projekt, beide sind jetzt verdrängt durch die java.Zeit-Klassen.
Definieren
DateTimeFormatter
Objekt mit ein Formatierungs-Muster, das auf Ihre Daten.Weisen eine
Locale
angeben, die die menschliche Sprache von den Namen-des-Tages und der name des Monats, sowie die kulturellen Normen für andere Probleme mit der Formatierung.Schließlich tun die Analyse zu bekommen
ZonedDateTime
Objekt.Beantragen können Sie die Zeitzone aus der
ZonedDateTime
, dargestellt als eineZoneId
Objekt. Sie können dann zu befragen, dieZoneId
wenn Sie weitere Informationen über das time zone.Sehen Sie selbst, in IdeOne.com.
ISO 8601
Vermeiden, den Austausch von Datum /Uhrzeit-Daten in dieser Art von schrecklichen - format. Gehen Sie nicht davon aus Englisch, nicht accessorize Ihre Leistung mit Sachen wie der name des Tages, und verwenden Sie niemals pseudo-Zeit-Zonen, wie
Eastern Daylight Time
.Zeitzonen: Geben Sie eine 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(!).Zum serialisieren Datum-Zeit-Werte in text, verwenden Sie nur die ISO 8601 Formate. Die java.Zeit-Klassen verwenden diese Formate standardmäßig beim Parsen/generieren von Zeichenfolgen repräsentieren Ihren Wert.
Über java.Zeit
Den java.Zeit framework ist in Java 8 und höher. Diese Klassen verdrängen die lästige alte legacy Datum-Zeit-Klassen wie
java.util.Date
,Calendar
, &" = SimpleDateFormat
.Den Joda-Time Projekt, jetzt in Wartung-Modus, rät migration nach java.Zeit.
Um mehr zu erfahren, siehe die Oracle Tutorial. Und die Suche Stack Overflow für viele Beispiele und Erklärungen. Spezifikation JSR 310.
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.Sowie eine teilweise Lösung könnte ein RegEx-match, um die Zeitzone, da Sie immer den gleichen text vor. AM oder PM.
Ich weiß nicht genug über Java Zeitzonen erhalten Sie den letzten Teil davon.
Der Hauptunterschied zwischen Datum und Kalender, das Datum ist nur ein Wert-Objekt keine Methoden, um es zu ändern. Also es ist konzipiert für das speichern eines Datum - /Uhrzeit-Informationen irgendwo. Wenn Sie ein Kalender-Objekt, das Sie ändern könnte, es wird nach einer persistenten entity, führt einige business-Logik mit dem Datum/Uhrzeit-Informationen. Das ist sehr gefährlich, weil die Person keine Möglichkeit hat, dies zu erkennen und zu ändern.
Die Calendar-Klasse ist speziell für Operationen auf Datum/Zeit, wie das hinzufügen von Tagen oder sowas.
Spielen, um bei deinem Beispiel bekomme ich die folgende:
Ausgabe:
Ist dies das Ergebnis, das Sie wollte?
Ed hat Recht. Sie wollen, dass die Zeitzone auf der DateFormat-Objekt nach der Zeit analysiert wurde.
produziert