konvertiere Millisekunden in ein Utc Date Objekt

Servus Forum,

ich habe ein Problem. Ich empfange über einen WCF Service einen Utc-Zeitstempel (JSON Format) bzw. die Millisekunden des Zeitstempels.
Aus diesen Millisekunden muss ich zwingend wieder ein Date-Objekt generieren - natürlich auch in Utc.

Wenn ich über das SimpleDateFormat die Zeitzone setze, und mir den String zurückgeben lasse, erhalte ich das korrekte Ergebnis: den 31.12.1999 23:00:00.

Parse ich diesen String jetzt in ein Date-Objekt, wird wieder die lokale Zeitzone berücksichtigt. Deshalb bin ich wieder eine Stunde "in der Zukunft" bzw.
erhalte ich als Ergebnis den 01.01.2000 00:00:00

Java:
                long milli = Long.parseLong("946681200000");
				
		SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
		formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
		String strDate =  formatter.format(new Date(milli)); //31-12-1999 23:00:00
		try {
			Date date = formatter.parse(strDate); //Sat Jan 01 00:00:00 MEZ 2000
		} 
		catch (ParseException e1) {
			e1.printStackTrace();
		}

Ich könnte folgendes "tricksen":

Java:
long milli = Long.parseLong("946681200000");
int offset = TimeZone.getDefault().getRawOffset();
Date dateoffset = new Date(milli - offset);

aber ob das eine saubere Lösung ist....??

Habt Ihr noch eine Idee / Lösung?

thxx....Grüße
 
946681200000 ist immer exakt ein Date, zeitzonenunabhängig,
dies ist Datum-Worte zu fassen erfordert natürlich dann doch eine Festlegung, es ist: 01.01.2000 0:00 bei uns bzw. 31.12 1999 23:00 bei UTC,

[c]new Date(milli)[/c] ist dieses Datum, 946681200000, da hat sich noch nichts getan,
[c]strDate = formatter.format(new Date(milli));[/c] ist 31.12 1999 23:00 bei UTC, auch dieses Datum, alles in Butter,

[c]Date date = formatter.parse(strDate);[/c]
jetzt wirds spannend, was ist date? du schreibst du erhälst eine Zeit in der Zukunf, das kann ich nicht nachvollziehen,
was meist du mit 'als Ergebnis den 01.01.2000 00:00:00'? welches ja immerhin auch eine korrekte Darstellung immernoch desselben Datums ist, nur eben in einer anderen Zeitzone?

meiner Ansicht nach gibt es hier bisher kein Problem, das geparste Date date stimmt mit dem vorherigen, mit [c]new Date(milli)[/c], überein, führe equals-Vergleich durch!,
es ist immer noch 946681200000, lass dir den Long-Wert ausgeben, erneutes Formatieren würde wieder zu 31.12 1999 23:00 führen,

01.01.2000 00:00:00 kommt nur raus, wenn für die Ausgabe eine andere Zeitzone gewählt wird, etwa bei
System.out.println(date)

hast du konkrete Anhaltspunkte für die Zukunftsvision?
 
hast du konkrete Anhaltspunkte für die Zukunftsvision?

...sonst würde mein Post keinen Sinn machen.
Allerdings habe ich eines vergessen zu erwähnen - ich programmiere eine Android Applikation, sollte in diesem Fall aber keine Rolle spielen da "SimpleDateFormat" und "Date" direkt aus dem Java Framework kommen.

Beim parsen des Strings (Utc Zeitstempel) in ein Date Objekt wird die lokal eingestellte Zeitzone meines Android-Gerätes berücksichtigt.

Gerade noch einmal mit dem Emulator getestet.

Java:
Date date = formatter.parse(strDate);

Beispiel:
Java:
Date date = formatter.parse("31-12-1999 23:00:00");

Ergebnis:  (java.util.Date) Fri Dec 31 15:00:00 GMT-08:00 1999

--> weil im Android Device eine Zeitzone GMT -08:00 eingestellt ist

Mir ist nicht klar wie ich das umgehen kann bzw. das parsen des Utc Strings in ein "Utc Date-Objekt" - die lokal eingestellte Zeitzone dabei komplett ignoriert.

Deshalb "tauschen" der WCF Service und meine App die Objekte in Utc - um der Problematik von irgendwelchen "Zeitversätzen" aus dem Weg zu gehen.

thx...
 
Zuletzt bearbeitet:
> ...sonst würde mein Post keinen Sinn machen.
genau das ist meinen Andeutungen nach der Fall 😉


> --> weil im Android Device eine Zeitzone GMT -08:00 eingestellt ist
ich sehe nach wie vor kein Problem, du bestimmst die Zeitzone des Parsers,
wenn du meinst dass "31-12-1999 23:00:00" ein Zeitpunkt in Zeitzone X ist, dann parse in Zeitzone X und die Ausgabe in einer anderen Zeitzone Y wird abweichen, ganz normal,
wenn du möchtest dass die Ausgabe danach in Zeitzone Y genau 'passt', dann parse doch gleich in Zeitzone Y?

klingt jetzt bisschen ungenau, aber das Beispiel zu Beginn und meine erste Antwort sollen glaube ich eindeutig sein,
 
> dann parse doch gleich in Zeitzone Y?

OK...das hab ich vor - deshalb setze ich ja die Zeitzone auf Utc:

Java:
 SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
 formatter.setTimeZone(TimeZone.getTimeZone("UTC"));

Das Ergebnis ist korrekt: 946681200000 = 31-12-1999 23:00:00 Utc
Java:
  String strDate =  formatter.format(new Date(946681200000)); //= 31-12-1999 23:00:00 Utc

Entweder ich stehe auf dem Schlauch.....aber jetzt zeig mir bitte wie Du daraus wieder ein Date Objekt erzeugen kannst ohne die lokale Zeitzone zu berücksichtigen. Im Date Objekt steht die lokale Zeit - abhänig von der eingestellten Zeitzone.
 
ein Date-Objekt ist wie long-Wert 946681200000 absolut Zeitzonen-unabhängig,
beschreibt unmissverständlich einen exakten Zeitpunkt in der Geschichte der Menschheit wenn man ihn zu interpretieren weiß,
kann überall auf der Welt und sogar von grünen Menschen auf Alpha Centauri exakt verwendet werden,
Missverständnisse sind unmöglich

------

die Zeitzone spielt bei Calendar eine Rolle, aber das lassen wir jetzt mal ganz außen vor, ist vorerst ja unbeteiligt,
es geht ja nur um Date vs. String,

-----

ein String wie "31-12-1999 23:00:00" ist ungenau, je nach Zeitzone ist es ein anderes Date, ein anderer long-Wert,

"31-12-1999 23:00:00 Utc" ist dagegen wieder eindeutig, da Zeitzone dabei ist, das ist dann wohl 946681200000,
während "31-12-1999 23:00:00" in unserer Zeitzone ein anderer Zeitpunkt ist, paar Stunden später oder früher

> aber jetzt zeig mir bitte wie Du daraus wieder ein Date Objekt erzeugen kannst ohne die lokale Zeitzone zu berücksichtigen

genau so wie du es im ersten Posting in Zeile 7 hast, mit dem SimpleDateFormat mit eingestellter Zeitzone parsen,
dann kommt wieder genau das gleiche raus,
wie in der ersten Antwort geschrieben schau dir den long-Wert an, vergleiche die Dates mit equals oder mache irgendwas nachvollziehbares,

-----

wenn du schreibst
> Ergebnis: (java.util.Date) Fri Dec 31 15:00:00 GMT-08:00 1999
> --> weil im Android Device eine Zeitzone GMT -08:00 eingestellt ist
dann ist das für mich einfach kein Widerspruch, denn diese Ausgabe ist ja exakt der Zeitpunkt 946681200000,

was ist dein Ziel? hast du eine nicht konfigurierbare Ausgabe, brauchst also 31-12-1999 23:00:00 in GMT?
ok, das klingt plausibel, darauf hätte ich schon eher eingehen können,

in diesem Fall sehe ich in der Tat nur die von dir schon angesprochene Lösung, das Date zu verändern, x Stunden zu addieren und abzuziehen,
denn du willst ja abweichende Zeiten anzeigen

besser wäre aber, die Darstellung selber zu KONTROLLIEREN, alles was auf dem Bildschirm zu sehen ist sind Strings,
wie Dates zu Strings werden kann man normalerweise selber bestimmen, eben mit Formatierung per SimpleDateFormat
 

Zurück
Oben