-
CSR
-
Resolution: Approved
-
P4
-
None
-
behavioral
-
low
-
This is to additionally parse the seconds in Custom IDs, and the existing parsing for hours/minutes won't change, applications that only deal with hours/minutes won't see a change.
-
Java API
-
SE
Summary
Support Custom ID with seconds granularity resolution in java.util.TimeZone class.
Problem
In JDK, there are two classes to represent time zones. One is java.util.TimeZone, and the other is java.time.ZoneId. There are conversion methods between two classes in TimeZone class, i.e., TimeZone.getTimeZone(ZoneId) and TimeZone.toZoneId(). If the conversion from a ZoneId to a TimeZone fails in TimeZone.getTimeZone(ZoneId), it defaults to GMT zone. For a fixed offset zone, it should not fall back to GMT because it only relies on a fixed offset value from GMT. However, due to the offset granularity difference (TimeZone's Custom ID has minute-level resolution and ZoneOffset (a subclass of ZoneId which represents a fixed offset zone) has second-level resolution), ZoneOffset to TimeZone falls back to GMT when the offset involves non-zero seconds.
Solution
Extend the definition of TimeZone's Custom ID with seconds granularity and accept the notation such as GMT+00:00:01. For compatibility, the seconds part is optional, and normalized custom IDs will not include the seconds part if it is zero.
Specification
Modify the Custom ID description in the class description of TimeZone class as:
* <blockquote><pre>
* <a id="CustomID"><i>CustomID:</i></a>
+ * {@code GMT} <i>Sign</i> <i>Hours</i> {@code :} <i>Minutes</i> {@code :} <i>Seconds</i>
* {@code GMT} <i>Sign</i> <i>Hours</i> {@code :} <i>Minutes</i>
* {@code GMT} <i>Sign</i> <i>Hours</i> <i>Minutes</i>
* {@code GMT} <i>Sign</i> <i>Hours</i>
* <i>Sign:</i> one of
* {@code + -}
* <i>Hours:</i>
* <i>Digit</i>
* <i>Digit</i> <i>Digit</i>
* <i>Minutes:</i>
* <i>Digit</i> <i>Digit</i>
+ * <i>Seconds:</i>
+ * <i>Digit</i> <i>Digit</i>
* <i>Digit:</i> one of
* {@code 0 1 2 3 4 5 6 7 8 9}
* </pre></blockquote>
*
- * <i>Hours</i> must be between 0 to 23 and <i>Minutes</i> must be
+ * <i>Hours</i> must be between 0 to 23 and <i>Minutes</i>/<i>Seconds</i> must be
* between 00 to 59. For example, "GMT+10" and "GMT+0010" mean ten
* hours and ten minutes ahead of GMT, respectively.
Also modify the normalized Custom ID description as:
* <blockquote><pre>
* <a id="NormalizedCustomID"><i>NormalizedCustomID:</i></a>
- * {@code GMT} <i>Sign</i> <i>TwoDigitHours</i> {@code :} <i>Minutes</i>
+ * {@code GMT} <i>Sign</i> <i>TwoDigitHours</i> {@code :} <i>Minutes</i> [<i>ColonSeconds</i>]
* <i>Sign:</i> one of
* {@code + -}
* <i>TwoDigitHours:</i>
* <i>Digit</i> <i>Digit</i>
* <i>Minutes:</i>
* <i>Digit</i> <i>Digit</i>
+ * <i>ColonSeconds:</i>
+ * {@code :} <i>Digit</i> <i>Digit</i>
* <i>Digit:</i> one of
* {@code 0 1 2 3 4 5 6 7 8 9}
* </pre></blockquote>
* For example, TimeZone.getTimeZone("GMT-8").getID() returns "GMT-08:00".
+ * <i>ColonSeconds</i> part only appears if the value is non-zero.
- csr of
-
JDK-8285844 TimeZone.getTimeZone(ZoneOffset) does not work for all ZoneOffsets and returns GMT unexpected
-
- Resolved
-