2016-07-20 8 views
1

Der folgende Code erzeugt unerwartetes Verhalten: Ich erwarte, dass beide Calendar denselben Wert für getTimeInMillis am Ende (1469008800000 in diesem Fall) und sie equal sein. - aber sie tun nicht ...Wie wird der Kalender nach der Verwendung von setTimeZone repariert?

Ich denke, das somethig mit http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4827490 zu tun hat, aber get nach setTimeZone does'nt Änderung etwas Aufruf wie „Umgehen“ geschrieben ("nach der Zeitzone zu ändern, müssen wir rufen einige Leseverfahren ") ...

Oder ist die‚Umgehen‘falsch und man hat einige get Methode vor mit setTimeZone anrufen?

Calendar calendar1 = Calendar.getInstance(TimeZone.getTimeZone("CET")); 
Calendar calendar2 = Calendar.getInstance(TimeZone.getTimeZone("CET")); 
calendar1.set(2016, 07 - 1, 20, 12, 00, 0); 
calendar2.set(2016, 07 - 1, 20, 12, 00, 0); 
calendar1.set(Calendar.MILLISECOND, 0); 
calendar2.set(Calendar.MILLISECOND, 0); 

System.out.println("creation: " + calendar1.equals(calendar2)); 

System.out.println(calendar1.getTimeInMillis()); 

System.out.println("get: " + calendar1.equals(calendar2)); 

calendar1.setTimeZone(TimeZone.getTimeZone("Z")); 
calendar2.setTimeZone(TimeZone.getTimeZone("Z")); 

System.out.println("setTimeZone: " + calendar1.equals(calendar2)); 

calendar1.get(Calendar.YEAR); 
calendar2.get(Calendar.YEAR); 

System.out.println("get: " + calendar1.equals(calendar2)); 

System.out.println(); 
System.out.println(calendar1.getTimeInMillis()); 
System.out.println(calendar2.getTimeInMillis()); 
System.out.println("end: " + calendar1.equals(calendar2)); 

Ausgang:

creation: true 
1469008800000 
get: true 
setTimeZone: false 
get: false 

1469008800000 
1469016000000 
end: false 

Antwort

0

Darf ich, dass Sie bieten im Code darauf hin, Sie beiden Kalender denselben Ausdruck auf den genauen gesetzt, aber den Calendar.MILISECONDS ändert Wert von einem Aufruf an die anderen scince Zeit läuft zwischen den beiden Anrufen.

Sie sollten in Ordnung sein, wenn Sie den zweiten Kalender auf den ersten setzen, anstatt ihn auf Calendar.MILISECONDS zu setzen.

EDIT: Nachdem die Frage bearbeitet wurde, ist meine Antwort nicht mehr relevant, ich behalte es für den alleinigen Zweck, seinen Kommentarabschnitt zu behalten.

+0

Haben Sie den Unterschied zwischen diesen Werten gesehen? 7200000ms also genau 2 Stunden. – eldo

+0

@CMax: Nach der 6. Zeile sind beide Kalender gleich ... –

+0

Tut mir leid, habe nicht bemerkt, an dieser Stelle ist meine Antwort nicht im Thema, aber es wird stehen, dass auch ohne einen Bug jeder Art die beiden Werte nicht gleich sein könnten , nur die Unterschiede sollten viel kleiner sein. – CMax

Verwandte Themen