Search code examples
javajava.util.datejava-17

java.util.Date special date 1980-04-06: wrong hour


We faced following problem:

    SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", java.util.Locale.GERMAN);
    String dateInString = "06-04-1980";
    Date date = formatter.parse(dateInString);

before: Sun Apr 06 00:00:00 CEST 1980

after: Sun Apr 06 01:00:00 CEST 1980

Another example:

Date date = Date.from(LocalDate.of(1980, 4, 6).atStartOfDay(ZoneId.systemDefault()).toInstant());

Facing the same problem.

We thought change of java11 to java17 is the problem, but it wasn't. It was the change of the timezone from Europe/Berlin to Europe Vienna. On 1980-04-06 the daylight saving time was established in Austria and the change of the hour was at 00:00. So there was no 00:00 at this date.

Reproduceable example - changing timezone to "Europe/Berlin" results in 0 hour.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
    for (LocalDate date = LocalDate.of(1500, 04, 01); date.isBefore(LocalDate.of(9999, 1, 1)); date = date.plusDays(1)) {
        Date out = Date.from(date.atStartOfDay(ZoneId.of("Europe/Vienna")).toInstant());
        Calendar cal = Calendar.getInstance();
        cal.setTimeZone(TimeZone.getTimeZone(ZoneId.of("Europe/Vienna")));
        cal.setTime(out);
        if (cal.get(Calendar.HOUR_OF_DAY) > 0) {
            System.out.println(date.format(formatter) + " > " + cal.get(Calendar.HOUR_OF_DAY));
        }
    }
    System.out.println("done");

All dates before 1893-03-31 have 23 as hour in timezone "Europe/Vienna", in "Europe/Berlin" its also 0.


Solution

  • It's not really a problem, it's a special thing about timezone "Europe/Vienna" which was changed in our system. If you get this problem, check your timezone, maybe it was changed by some other properties.

    While summer time (DST) started at 02:00 o’clock in Germany on that date, it started already at midnight in Austria (Europe/Vienna time zone), so the time 00:00 did not exist, which is why we suddenly got 01:00. Both time zones are printed as CEST (Central European Summer Time), so the abbreviation does not allow us to distinguish.