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

ZonedDateTime.parse() not correctly handling MST zone (U.Mountain Standard Time)

XMLWordPrintable

    • 9
    • generic
    • generic

      ADDITIONAL SYSTEM INFORMATION :
      Confirmed on Ubuntu x64 Linux and Windows 10.

      A DESCRIPTION OF THE PROBLEM :
      JDK 8's ZonedTimeTime.parse() correctly parses a date+time with MST correctly but with JDK 11 (and also JDK10.0.2) the value is incorrectly parsed.

      REGRESSION : Last worked in version 8u181

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Run the attached test case.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Correctly parsed value using Java 8:

        Original value: 2017-01-12T23:00MST
       Converted value: 2017-01-12T23:00-07:00[America/Denver]

      ACTUAL -
      Incorrectly result using Java 10 and 11ea:

        Original value: 2017-01-12T23:00MST
       Converted value: 2017-01-12T16:00-07:00[America/Denver]

      ---------- BEGIN SOURCE ----------
      import java.time.ZoneOffset;
      import java.time.ZonedDateTime;
      import java.time.format.DateTimeFormatter;
      import java.time.format.DateTimeFormatterBuilder;
      import java.time.temporal.ChronoField;

      public class ZonedDateTimeTestCase {

        // comprehensive pattern to handle any type of ISO8601 Date / Date-Time
        private static final String comprehensivePattern = "[yyyyMMdd][yyyy-MM-dd][yyyy-DDD]"
                + "['T'[HHmmss][HHmm][HH:mm:ss][HH:mm][.SSSSSSSSS]"
                + "[.SSSSSS][.SSS][.SS][.S]][OOOO][O][z][XXXXX][XXXX]['['VV']']";

        // formatter used to parse an ISO8601 string using the comprehensive pattern
        // pattern includes default values for time in case time information is missing
        private static final DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
                .append(DateTimeFormatter.ofPattern(comprehensivePattern))
                .parseDefaulting(ChronoField.OFFSET_SECONDS, ZoneOffset.UTC.getTotalSeconds())
                .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
                .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
                .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
                .toFormatter();

        private static final String testDate1 = "2017-01-12T23:00MST";

        public static final void main(String[] args) {
          final ZonedDateTime convertedValue = ZonedDateTime.parse(testDate1, dateFormatter);
          System.out.println(" Original value: " + testDate1);
          System.out.println(" Converted value: " + convertedValue.toString());
        }
      }

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

      CUSTOMER SUBMITTED WORKAROUND :
      None that I'm aware of.

      FREQUENCY : always


            naoto Naoto Sato
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated:
              Resolved: