Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8270294

Date to Instant conversion gives wrong result

XMLWordPrintable

      ADDITIONAL SYSTEM INFORMATION :
      Windows 10 Education Version 20H1 (Build 19042.1083) x64
      Intel(R) Core(TM) i5-7300HQ CPU @ 2.50GHz

      java version "11.0.11" 2021-04-20 LTS
      Java(TM) SE Runtime Environment 18.9 (build 11.0.11+9-LTS-194)
      Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.11+9-LTS-194, mixed mode)

      A DESCRIPTION OF THE PROBLEM :
      If I try to convert the LocalDate 2017-03-01 with the ZoneID "Europe/Berlin" into an Instant, I get the result 2017-02-28T23:00:00Z. However, 2017-02-28T23:00:00Z was expected.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Run provided source code.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      2017-03-01T00:00:00Z for example 1.
      2020-03-01T00:00:00Z for example 2.
      ACTUAL -
      2017-02-28T23:00:00Z for example 1.
      2020-02-29T23:00:00Z for example 2.

      ---------- BEGIN SOURCE ----------
      import java.time.Instant;
      import java.time.LocalDate;
      import java.time.ZoneId;
      import java.time.ZonedDateTime;

      public class Test {

      private static final ZoneId ZONE_ID_EUROPE_BERLIN = ZoneId.of("Europe/Berlin");

      public static void main(final String[] args) {
      // No Leap year
      final LocalDate date1 = LocalDate.of(2017, 03, 01);
      final Instant date1AsInstant = date1.atStartOfDay(ZONE_ID_EUROPE_BERLIN).toInstant();
      System.out.println(date1AsInstant.toString()); // Expected 2017-03-01T00:00:00Z but was 2017-02-28T23:00:00Z

      final Instant zonedDateTime1 = ZonedDateTime.of(2017, 03, 01, 00, 00, 00, 00, ZONE_ID_EUROPE_BERLIN)
      .toInstant();
      System.out.println(zonedDateTime1.toString()); // Expected 2017-03-01T00:00:00Z but was 2017-02-28T23:00:00Z

      // Leap year
      final LocalDate date2 = LocalDate.of(2020, 03, 01);
      final Instant date2AsInstant = date2.atStartOfDay(ZONE_ID_EUROPE_BERLIN).toInstant();
      System.out.println(date2AsInstant); // Expected 2020-03-01T00:00:00Z but was 2020-02-29T23:00:00Z

      final Instant zonedDateTime2 = ZonedDateTime.of(2020, 03, 01, 00, 00, 00, 00, ZONE_ID_EUROPE_BERLIN)
      .toInstant();
      System.out.println(zonedDateTime2); // Expected 2020-03-01T00:00:00Z but was 2020-02-29T23:00:00Z
      }

      }

      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      unknown

      FREQUENCY : always


            tongwan Andrew Wang
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: