anm
anm

Reputation: 545

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.

Upvotes: 3

Views: 522

Answers (2)

anm
anm

Reputation: 545

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.

Upvotes: 3

Abra
Abra

Reputation: 20914

I am in Israel, so in order to simulate the time zone of central Europe (using Java 17), I set the [System] property user.timezone to CET using the -D option of the java command. Then I ran the following code:

/*
 * import java.time.ZoneId;
 * import java.time.ZonedDateTime;
 * import java.util.Date;
 */
ZonedDateTime zdt = ZonedDateTime.of(1980, 4, 6, 0, 0, 0, 0, ZoneId.systemDefault());
System.out.println(Date.from(zdt.toInstant()));

The result I got was:

Sun Apr 06 00:00:00 CET 1980

This is the result that you want, correct?

Upvotes: 0

Related Questions