Bei einem nächtlichen Build von Jenkins fiel einer unserer Tests um 2:00:12 Uhr aus. Nach einiger Zeit Debugging und Änderung der Systemzeit meines Computers war ich sehr verwirrt. Dann schrieb ich den folgenden Test (Simulation des Problems), der fehlschlägt, aber ich kann nicht verstehen, warum. Ich habe Google ausprobiert, aber nichts ähnliches gefunden.
Kann jemand erklären, warum die letzte Behauptung fehlschlägt?Verwirrender Test fehlgeschlagen - Sommerzeit
@Test
public void testFirstBeforeSecond_atDayLightSavingTime() throws ParseException {
Date first = new SimpleDateFormat("dd-MM-yyyy HH:mm").parse("25-10-2015 00:59");
Date second = new SimpleDateFormat("dd-MM-yyyy HH:mm").parse("25-10-2015 01:01");
assertThat(first.before(second), is(true)); // Ok, as expected
first = add(first, Calendar.HOUR_OF_DAY, 2);
second = add(second, Calendar.HOUR_OF_DAY, 2);
assertThat(first.before(second), is(true)); // Ok, as expected
first = add(first, Calendar.DAY_OF_YEAR, 2);
second = add(second, Calendar.DAY_OF_YEAR, 2);
assertThat(first.before(second), is(true)); // Fails?
}
private Date add(Date date, int field, int amount) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("Europe/Brussels"));
calendar.setTime(date);
calendar.add(field, amount);
return calendar.getTime();
}
(In Brüssel Zeitzone, beendet die Sommerzeit auf 25-10-15 um 3 Uhr morgens. Die Uhr dann um eine Stunde zurücksprang.)
Sie definieren nie eine TimeZone! Auf jedem Gerät, auf dem dieser Code ausgeführt wird, wird die Standardzeitzoneneinstellung des Hostsystems verwendet. Ihr lokaler Computer läuft normalerweise in lokaler Zeit und Server oft in UTC. Hast du darüber nachgedacht? –
Möglicherweise im Zusammenhang mit http://stackoverflow.com/questions/13611108/problems-with-java-daylight-savings-time – dkatzel
@ReneM. Zeitzone wird in der privaten Methode 'add' festgelegt:' calendar.setTimeZone (TimeZone.getTimeZone ("Europe/Brussels")); ' – Manu