2010-01-28 9 views
8

[Client-Seite GWT Klasse]Zeitzonen in Java/GWT (Client-Seite)

Ich habe ein Date-Objekt ...

Date dataObject = DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ss.SSS") 
         .parse("2009-10-12T00:00:00.000); 

Dies funktioniert gut. Aber wenn ich ein:

dateObject.getTime(); 

Es gibt eine UNIX-Zeit Millisekunden ein GMT mit Sommer verwenden, daher ist es eine UNIX-Zeit machen kann ich nicht verwenden. Ich brauche es in UTC. Wie mache ich das?


Zeit ein Datum Ich bin Parsen und es ist mir etwas zurückzugeben:

'Thu Apr 16 08:46:20 GMT+100 2009' @ '1239867980191' 

jedoch das Datum, das ich in 1 Stunde vorbei bin weniger als diese Zeit (7.46 und nicht mehr als 8 : 46!).

Wie übertrage ich die Tatsache, dass es UTC ist? Oder wenn es UTC nicht benutzen kann (was lächerlich wäre), wie nutze ich GMT ohne die Sommerzeit?

+9

Es gibt kein Konzept von "UNIX Time (in) Millisekunden mit einem GMT mit Tageslichteinsparungen". Die Anzahl der Millisekunden, die seit der "Epoche" verstrichen sind, ist fest und hängt nicht mit GMT und/oder Sommerzeit zusammen. Sie können entweder einen falsch formatierten Zeitstring eingeben und/oder vergessen, genau zu bestimmen, ob Sie Sommerzeit sparen oder nicht oder Ihre Zeit in Millisekunden falsch in ein anderes Format umrechnen. Aber die Anzahl der Millisekunden seit der Epoche (die sowohl von Java als auch von Unix und vielen anderen Technologien verwendet wird) ist absolut unwichtig gegenüber GMT und der Sommerzeit. – SyntaxT3rr0r

+0

OldEnthusiast: Dies sollte eine Antwort sein. –

+0

Nun, Sie bekommen sicherlich den Pedant des Tages Auszeichnung. – Federer

Antwort

5

Ihre letzte Bearbeitung macht die Dinge klarer.

Im Grunde sind Sie verwirrt, und Sie bekommen bereits, was Sie wollen.

1239867980191 Millisekunden seit der Epoch übersetzt auf Donnerstag, 16. April 2009, um 7: 46: 20.191 in der GMT-Zeitzone. Der gleiche Augenblick wird auf denselben Tag übertragen, aber 8: 46: 20.191 in der GMT + 01-Zeitzone. Wenn Ihre Eingabezeichenfolge "7: 46: 20.191" lautet und Sie tatsächlich 1239867980191 von Date.getTime() erhalten haben, dann gratuliert Ihnen der Parsingcode, dass Ihr "7: 46: 20.191" in der GMT-Zeitzone interpretiert werden kann, und hat es richtig gemacht.

Wenn danach Sie erhalten "8:46:20" beim Drucken, dies ist nur, weil Sie die Zeitzone GMT + 01 für die Anzeige dieses Augenblicks verwenden. Beachten Sie, dass die Zeichenfolge genau GMT+100 enthält, um Sie darüber zu informieren, dass sie diese Zeitzone für Anzeigezwecke verwendet. Die sofortige welche die Date Instanz darstellt, ist nichtsdestoweniger genau der Moment, den Sie wünschen, dass es enthält. Denken Sie daran, dass eine Date Instanz einen Zeitpunkt darstellt, für den keine Zeitzone gilt: Zeitzonen werden verwendet, um Zeitpunkte in Kalenderelemente (Tage, Stunden ...) und zurück zu konvertieren.

Um eine Date in eine darstellbare Zeichenfolge zu konvertieren, verwenden Sie DateTimeFormat.format(Date, TimeZone), mit der Sie angeben können, welche Zeitzone für diese Zeichenfolge verwendet werden soll.

+0

+1 für nette Erläuterungen und Hinweise auf 'DateTimeFormat.format (Date, TimeZone)' –

+0

Wow, das war eine verwirrende Situation Es scheint, dass Sie richtig sind. Danke für die extra Klarheit :) – Federer

-2

Versuchen Sie das Objekt Calendar.

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 
Date dataObject = DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ss.SSS") 
        .parse("2009-10-12T00:00:00.000); 
cal.setTime(dataObject); 
cal.getTimeInMillis(); 

nach API, getTimeInMillis() gibt "die aktuelle Zeit als UTC Millisekunden von der Zeit."

BEARBEITEN: Wie _bravado darauf hingewiesen, die Kalender-API ist derzeit nicht für GWT (Issue 603) verfügbar. Während dies in einer Java-Anwendung die passende Zeit bekommen würde, wird es hier nicht funktionieren. Es gibt Informationen in der group über die Verwendung von GMT.

EDIT: Fehlt eine Schließbügel auf der der Calendar.getInstance() aufrufen

+6

Ich glaube nicht, dass Sie Kalender mit GWT verwenden können? – Federer

+0

Sehr guter Punkt. – justkt

3

Da die Calendar Klasse in GWT nicht unterstützt wird, vielleicht etwas hackish wie dies funktioniert:

final String timezone = "GMT-07:00"; 
DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ssZZZZ"); 
long unix = dtf.parse("2009-10-12T00:00:00" + timezone).getTime(); 

Auf diese Weise können Sie die richtigen Zeitzoneninformationen angeben. Dies sollte jedoch das Standardverhalten sein.

+0

Das ist die Art von Sache, die ich versuchte. Allerdings konnte ich überhaupt keine richtige Kombination finden. Ich hätte gedacht, dass der Zeitzonencode für UTC "UTC" wäre? Ist nicht -7: 00 Kalifornien oder so? – Federer

+0

Ich habe "GMT-07: 00" 'als Beispiel hinzugefügt, Sie sollten zu dem Wert wechseln, der für Sie arbeitet;] (damit Sie Ihre" UNIX-Zeit Millisekunden mit einer GMT mit Sommerzeiteinsparungen "erhalten;)) –

1

Es ist umgekehrt. Eine Date Instanz speichert die Zeit in Millisekunden seit der Epoche unter Verwendung der UTC-Zeitskala (d. H. Schaltsekunden werden ignoriert). Dies ist, was Date.getTime() zurückgibt und das ist was du willst.

Der Schuldige hier ist der Parser, der das Datum interpretiert, das Sie als Zeichenfolge in Ihrer lokalen Zeitzone angeben. Wenn Sie DateTimeFormat wollen die Zeichenfolge als Datum-und-Zeit in der UTC-Zeitzone gegeben zu interpretieren, hängen Sie eine explizite Zeitzone an die analysierte Zeichenfolge:

DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ssZZZZ") 
    .parse("2009-10-12T00:00:00.000" + " GMT"); 

(Die oben geht davon aus, dass ich GWT Dokumentation richtig verstanden; Ich habe es nicht versucht.

Nur um in meinen Notizen klar zu sein: für alle praktischen Zwecke gibt es keinen Unterschied zwischen "GMT" und "UTC", und es gibt keine Sommerzeit in der GMT-Zeitzone.Andere Zeitzonen werden oft als "GMT plus oder minus ein Offset" definiert und der Offset kann sich zwischen Sommer und Winter ändern. Zum Beispiel entspricht die Zeitzone in New York etwas "GMT-04" im Sommer und "GMT-05" im Winter.

+0

I Denken Sie, dass GMT automatisch Sommerzeiteinsparungen einschließt - was ich nicht will. Ich möchte einfach UTC oder normale GMT. – Federer

+0

Korrigieren Sie das - es tut. :( – Federer

+0

@_bravado: Es tut nicht, also warum Großbritannien BST im Sommer verwendet. – Powerlord

0

Ich sehe immer Formate mit ZZZZ vorgeschlagen ... aber warum?

"yyyy-MM-dd'T'HH: mm: ss.SSSZ" würde

Ergebnisse "2009-10-12T00: 00: 00.000-0000"

Der letzte Teil ist der Versatz von UTC; Kalifornien (um die Zeit eines anderen zu nutzen) wäre im Sommer -0800, -0700.

Als Randnotiz ist GMT auch immer -0000. Aus diesem Grund ist die britische Sommerzeit BST (British Summer Time, +0100).

+0

Ich gebe einen Zeitstempel aus einer Datei extrahiert, die in UTC ist. Ich gebe es weiter mit Ihren Vorschlägen - und es konvertiert es in GMT Summertime - wieder einmal. Entweder denken Sie nicht GWT Client-Side oder etwas ist grundsätzlich falsch mit meinem GWT - das ist die neueste Version. – Federer