This is an automated email from the ASF dual-hosted git repository.

desruisseaux pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git


The following commit(s) were added to refs/heads/geoapi-4.0 by this push:
     new f8a9c9ae79 Partial replacement of `java.util.TimeZone` by 
`java.time.ZoneId`. The old timezone is kept in codes related to 
`java.text.Format`. This commit has two incompatible changes:
f8a9c9ae79 is described below

commit f8a9c9ae792f5da2c2f4da4195c1b0048f4b28ce
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Sat Apr 5 11:09:52 2025 +0200

    Partial replacement of `java.util.TimeZone` by `java.time.ZoneId`.
    The old timezone is kept in codes related to `java.text.Format`.
    This commit has two incompatible changes:
    
    - `OptionKey.TIMEZONE` parameterized type changed from `<TimeZone>` to 
`<ZoneId>`.
      This change was announced in the Javadoc comment.
    - `XML.TIMEZONE` property is now associated to a value of class `ZoneId`.
      However, the `setProperty(…)` method accepts a value of the two classes.
---
 .../main/org/apache/sis/console/AboutCommand.java   |  4 ++--
 .../main/org/apache/sis/console/CommandRunner.java  |  9 +++++----
 .../org/apache/sis/console/CommandRunnerTest.java   | 11 ++++++-----
 .../main/org/apache/sis/xml/MarshalContext.java     | 21 +++++++++++++++------
 .../main/org/apache/sis/xml/Pooled.java             | 21 +++++++++++++++++----
 .../main/org/apache/sis/xml/XML.java                |  5 +++--
 .../main/org/apache/sis/xml/bind/Context.java       |  8 ++++----
 .../org/apache/sis/xml/privy/XmlUtilitiesTest.java  |  2 +-
 .../test/org/apache/sis/xml/test/TestCase.java      |  4 ++--
 .../main/org/apache/sis/io/wkt/WKTFormat.java       | 16 +++++++++++++++-
 .../test/org/apache/sis/io/wkt/WKTFormatTest.java   |  3 ++-
 .../apache/sis/storage/geotiff/GeoTiffStore.java    |  5 +++--
 .../apache/sis/storage/netcdf/base/GridMapping.java |  3 +--
 .../sis/storage/xml/stream/StaxDataStore.java       |  4 ++--
 .../org/apache/sis/storage/base/URIDataStore.java   |  4 ++--
 .../main/org/apache/sis/storage/folder/Store.java   |  8 ++++----
 .../apache/sis/storage/folder/StoreProvider.java    |  6 +++---
 .../org/apache/sis/storage/wkt/StoreFormat.java     |  4 ++--
 .../main/org/apache/sis/setup/OptionKey.java        | 11 +++--------
 .../sis/storage/shapefile/ShapefileStore.java       |  3 +--
 .../org/apache/sis/gui/referencing/WKTPane.java     |  3 ++-
 .../main/org/apache/sis/storage/gdal/GDALStore.java |  2 +-
 22 files changed, 96 insertions(+), 61 deletions(-)

diff --git 
a/endorsed/src/org.apache.sis.console/main/org/apache/sis/console/AboutCommand.java
 
b/endorsed/src/org.apache.sis.console/main/org/apache/sis/console/AboutCommand.java
index 3744340a70..ffad45f08c 100644
--- 
a/endorsed/src/org.apache.sis.console/main/org/apache/sis/console/AboutCommand.java
+++ 
b/endorsed/src/org.apache.sis.console/main/org/apache/sis/console/AboutCommand.java
@@ -108,7 +108,7 @@ final class AboutCommand extends CommandRunner {
                 /*
                  * Provide information about the local SIS installation.
                  */
-                configuration = About.configuration(sections, locale, 
timezone).toString();
+                configuration = About.configuration(sections, locale, 
getTimeZone()).toString();
             } else {
                 /*
                  * Provide information about a remote SIS installation. Those 
information are accessible
@@ -128,7 +128,7 @@ final class AboutCommand extends CommandRunner {
                     try (JMXConnector jmxc = JMXConnectorFactory.connect(url)) 
{
                         final MBeanServerConnection mbsc = 
jmxc.getMBeanServerConnection();
                         final SupervisorMBean bean = JMX.newMBeanProxy(mbsc, 
new ObjectName(Supervisor.NAME), SupervisorMBean.class);
-                        table = bean.configuration(sections, locale, timezone);
+                        table = bean.configuration(sections, locale, 
getTimeZone());
                         warnings = bean.warnings(locale);
                     }
                 } catch (IOException e) {
diff --git 
a/endorsed/src/org.apache.sis.console/main/org/apache/sis/console/CommandRunner.java
 
b/endorsed/src/org.apache.sis.console/main/org/apache/sis/console/CommandRunner.java
index 0435c1e702..cfc28604dc 100644
--- 
a/endorsed/src/org.apache.sis.console/main/org/apache/sis/console/CommandRunner.java
+++ 
b/endorsed/src/org.apache.sis.console/main/org/apache/sis/console/CommandRunner.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.console;
 
+import java.time.ZoneId;
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Locale;
@@ -91,13 +92,13 @@ abstract class CommandRunner {
 
     /**
      * The locale specified by the {@code "--timezone"} option, or null if no 
timezone was specified.
-     * The null value may be interpreted as the {{@linkplain 
TimeZone#getDefault() default timezone}
+     * The null value may be interpreted as the {{@linkplain 
ZoneId#systemDefault() default timezone}
      * or as UTC, depending on the context. For example, WKT parsing and 
formatting use UTC unless
      * specified otherwise.
      *
      * @see #getTimeZone()
      */
-    protected final TimeZone timezone;
+    protected final ZoneId timezone;
 
     /**
      * The encoding specified by the {@code "--encoding"} option. If no such 
option was provided,
@@ -225,7 +226,7 @@ abstract class CommandRunner {
             locale = (s != null) ? Locales.parse(s) : 
Locale.getDefault(Locale.Category.DISPLAY);
 
             value = s = getOptionAsString(option = Option.TIMEZONE);
-            timezone = (s != null) ? TimeZone.getTimeZone(s) : null;
+            timezone = (s != null) ? ZoneId.of(s) : null;
 
             value = s = getOptionAsString(option = Option.ENCODING);
             explicitEncoding = (s != null);
@@ -267,7 +268,7 @@ abstract class CommandRunner {
      * but the {@linkplain TimeZone#getDefault() default timezone} is 
preferred instead.
      */
     protected final TimeZone getTimeZone() {
-        return (timezone != null) ? timezone : TimeZone.getDefault();
+        return (timezone != null) ? TimeZone.getTimeZone(timezone) : 
TimeZone.getDefault();
     }
 
     /**
diff --git 
a/endorsed/src/org.apache.sis.console/test/org/apache/sis/console/CommandRunnerTest.java
 
b/endorsed/src/org.apache.sis.console/test/org/apache/sis/console/CommandRunnerTest.java
index 4f73725875..0081614e8c 100644
--- 
a/endorsed/src/org.apache.sis.console/test/org/apache/sis/console/CommandRunnerTest.java
+++ 
b/endorsed/src/org.apache.sis.console/test/org/apache/sis/console/CommandRunnerTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.console;
 
+import java.time.ZoneId;
 import java.util.EnumSet;
 import java.util.Locale;
 import java.util.TimeZone;
@@ -85,10 +86,10 @@ public final class CommandRunnerTest extends TestCase {
      */
     @Test
     public void testTimeZone() throws InvalidOptionException {
-        final CommandRunner c = new Dummy(EnumSet.allOf(Option.class), 
CommandRunner.TEST, "--timezone", "JST");
+        final CommandRunner c = new Dummy(EnumSet.allOf(Option.class), 
CommandRunner.TEST, "--timezone", "Asia/Tokyo");
         assertEquals(Option.TIMEZONE, getSingleton(c.options.keySet()));
-        assertEquals(TimeZone.getTimeZone("JST"), c.timezone, "timezone");
-        assertEquals(TimeUnit.HOURS.toMillis(9), c.timezone.getRawOffset(), 
"rawoffset");
+        assertEquals(TimeZone.getTimeZone("Asia/Tokyo"), c.getTimeZone(), 
"timezone");
+        assertEquals(TimeUnit.HOURS.toMillis(9), 
c.getTimeZone().getRawOffset(), "rawoffset");
         assertTrue(c.files.isEmpty(), "files.isEmpty()");
     }
 
@@ -113,12 +114,12 @@ public final class CommandRunnerTest extends TestCase {
     @Test
     public void testOptionMix() throws InvalidOptionException {
         final CommandRunner c = new Dummy(EnumSet.allOf(Option.class), 
CommandRunner.TEST,
-                "--brief", "--locale", "ja", "--verbose", "--timezone", "JST");
+                "--brief", "--locale", "ja", "--verbose", "--timezone", 
"Asia/Tokyo");
         assertEquals(EnumSet.of(Option.BRIEF, Option.LOCALE, Option.VERBOSE, 
Option.TIMEZONE), c.options.keySet(), "options");
 
         // Test specific values.
         assertSame(Locale.JAPANESE, c.locale, "locale");
-        assertEquals(TimeZone.getTimeZone("JST"), c.timezone, "timezone");
+        assertEquals(ZoneId.of("Asia/Tokyo"), c.timezone, "timezone");
         assertTrue(c.files.isEmpty(), "files.isEmpty()");
     }
 
diff --git 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/MarshalContext.java
 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/MarshalContext.java
index 4509ff7470..d876e8a5de 100644
--- 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/MarshalContext.java
+++ 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/MarshalContext.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.xml;
 
+import java.time.ZoneId;
 import java.net.URI;
 import java.util.Locale;
 import java.util.Optional;
@@ -80,16 +81,24 @@ public abstract class MarshalContext implements Localized {
      *
      * <h4>Handling of <code>null</code> timezone</h4>
      * A {@code null} value means that the timezone is unspecified. Callers 
are encouraged
-     * to use the UTC timezone as the default value, but some flexibility is 
allowed.
+     * to use the <abbr>UTC</abbr> timezone as the default value, but some 
flexibility is allowed.
      *
-     * <div class="warning"><b>Upcoming API change — Java time API</b>:
-     * return type may be changed to {@link java.time.ZoneId} in a future 
version.
-     * This change may be applied in synchronization with GeoAPI 4.0.
-     * </div>
+     * @return the timezone for the <abbr>XML</abbr> fragment being 
(un)marshalled, or {@code null} if unspecified.
+     *
+     * @since 1.5
+     */
+    public abstract ZoneId getZoneId();
+
+    /**
+     * Returns the legacy timezone to use for (un)marshalling, or {@code null} 
if none was explicitly specified.
+     * This is he value returned by {@link #getZoneId()} converted to the 
legacy Java object.
      *
      * @return the timezone for the XML fragment being (un)marshalled, or 
{@code null} if unspecified.
      */
-    public abstract TimeZone getTimeZone();
+    public TimeZone getTimeZone() {
+        ZoneId timezone = getZoneId();
+        return (timezone != null) ? TimeZone.getTimeZone(timezone) : null;
+    }
 
     /**
      * Returns the schema version of the XML document being (un)marshalled.
diff --git 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/Pooled.java 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/Pooled.java
index 5a6fb9bff1..b2c170c47c 100644
--- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/Pooled.java
+++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/Pooled.java
@@ -20,11 +20,12 @@ import java.util.Map;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.ConcurrentModificationException;
-import java.util.IllformedLocaleException;
 import java.util.Locale;
 import java.util.TimeZone;
 import java.util.function.UnaryOperator;
 import java.util.logging.Filter;
+import java.time.ZoneId;
+import java.time.DateTimeException;
 import javax.xml.validation.Schema;
 import jakarta.xml.bind.Marshaller;
 import jakarta.xml.bind.JAXBException;
@@ -97,7 +98,7 @@ abstract class Pooled {
      * The timezone, or {@code null} if unspecified.
      * Can be set by the {@link XML#TIMEZONE} property.
      */
-    private TimeZone timezone;
+    private ZoneId timezone;
 
     /**
      * The base URL of ISO 19115-3 (or other standards) schemas. It shall be 
an unmodifiable
@@ -310,7 +311,19 @@ abstract class Pooled {
                     return;
                 }
                 case XML.TIMEZONE: {
-                    timezone = (value instanceof CharSequence) ? 
TimeZone.getTimeZone(value.toString()) : (TimeZone) value;
+                    if (value instanceof CharSequence) {
+                        String id = value.toString();
+                        try {
+                            timezone = ZoneId.of(id);
+                        } catch (DateTimeException e) {
+                            timezone = TimeZone.getTimeZone(id).toZoneId();
+                            if (timezone.getId().equals("GMT")) {
+                                throw e;
+                            }
+                        }
+                    } else {
+                        timezone = (value instanceof TimeZone) ? ((TimeZone) 
value).toZoneId() : (ZoneId) value;
+                    }
                     return;
                 }
                 case XML.SCHEMAS: {
@@ -390,7 +403,7 @@ abstract class Pooled {
                     return;
                 }
             }
-        } catch (ClassCastException | IllformedLocaleException e) {
+        } catch (RuntimeException e) {
             throw new PropertyException(Errors.format(
                     Errors.Keys.IllegalPropertyValueClass_2, name, 
value.getClass()), e);
         }
diff --git 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/XML.java 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/XML.java
index 80958b3447..1c7567d5c8 100644
--- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/XML.java
+++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/XML.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.xml;
 
+import java.time.ZoneId;
 import java.util.Map;
 import java.util.Locale;
 import java.util.TimeZone;
@@ -125,8 +126,8 @@ public final class XML extends Static {
 
     /**
      * Specifies the timezone to use for marshalling dates and times.
-     * The value for this property shall be an instance of {@link TimeZone}
-     * or a {@link CharSequence} recognized by {@link 
TimeZone#getTimeZone(String)}.
+     * The value for this property shall be an instance of {@link ZoneId}, 
{@link TimeZone}, or a
+     * {@link CharSequence} recognized by {@link ZoneId#of(String)} or {@link 
TimeZone#getTimeZone(String)}.
      *
      * <h4>Default behavior</h4>
      * If this property is never set, then (un)marshalling will use the
diff --git 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/Context.java
 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/Context.java
index 006ebf9d9f..5c9ca975f4 100644
--- 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/Context.java
+++ 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/Context.java
@@ -17,11 +17,11 @@
 package org.apache.sis.xml.bind;
 
 import java.net.URI;
+import java.time.ZoneId;
 import java.util.Map;
 import java.util.HashMap;
 import java.util.IdentityHashMap;
 import java.util.Locale;
-import java.util.TimeZone;
 import java.util.Collections;
 import java.util.Optional;
 import java.util.logging.Level;
@@ -152,7 +152,7 @@ public final class Context extends MarshalContext {
      * The timezone, or {@code null} if unspecified.
      * In the latter case, an implementation-default (typically UTC) timezone 
is used.
      */
-    private final TimeZone timezone;
+    private final ZoneId timezone;
 
     /**
      * The base URL of ISO 19115-3 (or other standards) schemas.
@@ -287,7 +287,7 @@ public final class Context extends MarshalContext {
     public Context(int                       bitMasks,
                    final MarshallerPool      pool,
                    final Locale              locale,
-                   final TimeZone            timezone,
+                   final ZoneId              timezone,
                    final Map<String,String>  schemas,
                    final Version             versionGML,
                    final Version             versionMetadata,
@@ -389,7 +389,7 @@ public final class Context extends MarshalContext {
      * @return the timezone in the context of current (un)marshalling process.
      */
     @Override
-    public final TimeZone getTimeZone() {
+    public final ZoneId getZoneId() {
         return timezone;
     }
 
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/privy/XmlUtilitiesTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/privy/XmlUtilitiesTest.java
index 5666f93d76..b54098ad63 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/privy/XmlUtilitiesTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/privy/XmlUtilitiesTest.java
@@ -79,7 +79,7 @@ public final class XmlUtilitiesTest extends TestCase {
      */
     @Test
     public void testTemporalToXML() throws DatatypeConfigurationException, 
JAXBException {
-        createContext(false, Locale.JAPAN, "JST");
+        createContext(false, Locale.JAPAN, "Asia/Tokyo");
         XMLGregorianCalendar calendar;
         Temporal t;
 
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/test/TestCase.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/test/TestCase.java
index 092eb318a5..4c6a54088f 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/test/TestCase.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/test/TestCase.java
@@ -19,8 +19,8 @@ package org.apache.sis.xml.test;
 import java.util.Map;
 import java.util.HashMap;
 import java.util.Locale;
-import java.util.TimeZone;
 import java.util.logging.Logger;
+import java.time.ZoneId;
 import java.io.InputStream;
 import java.io.StringReader;
 import java.io.StringWriter;
@@ -186,7 +186,7 @@ public abstract class TestCase extends 
org.apache.sis.test.TestCase {
      */
     protected final void createContext(final boolean marshal, final Locale 
locale, final String timezone) throws JAXBException {
         context = new Context(marshal ? Context.MARSHALLING : 0, 
getMarshallerPool(), locale,
-                (timezone != null) ? TimeZone.getTimeZone(timezone) : null, 
null, null, null, null, null, null, null);
+                (timezone != null) ? ZoneId.of(timezone) : null, null, null, 
null, null, null, null, null);
     }
 
     /**
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/WKTFormat.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/WKTFormat.java
index d2ff6dda46..62390ce515 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/WKTFormat.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/WKTFormat.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.io.wkt;
 
+import java.time.ZoneId;
 import java.util.Date;
 import java.util.Locale;
 import java.util.TimeZone;
@@ -306,7 +307,7 @@ public class WKTFormat extends CompoundFormat<Object> {
      * @since 1.5
      */
     public WKTFormat() {
-        this(null, null);
+        this(null, (TimeZone) null);
     }
 
     /**
@@ -321,6 +322,19 @@ public class WKTFormat extends CompoundFormat<Object> {
      *
      * @see #getLocale()
      * @see #getTimeZone()
+     *
+     * @since 1.5
+     */
+    public WKTFormat(final Locale locale, final ZoneId timezone) {
+        this(locale, (timezone != null) ? TimeZone.getTimeZone(timezone) : 
null);
+    }
+
+    /**
+     * Creates a format for the given locale and legacy timezone.
+     * See {@link #WKTFormat(Locale, ZoneId)} for the description.
+     *
+     * @param  locale    the locale for the new {@code Format}, or {@code 
null} for {@code Locale.ROOT}.
+     * @param  timezone  the timezone for dates in the WKT temporal elements, 
or {@code null} for UTC.
      */
     public WKTFormat(final Locale locale, final TimeZone timezone) {
         super(locale, timezone);
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/io/wkt/WKTFormatTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/io/wkt/WKTFormatTest.java
index 964f757318..1a556fdeb6 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/io/wkt/WKTFormatTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/io/wkt/WKTFormatTest.java
@@ -20,6 +20,7 @@ import java.net.URI;
 import java.util.Map;
 import java.util.Locale;
 import java.text.ParseException;
+import java.time.ZoneId;
 import org.opengis.parameter.ParameterValue;
 import org.opengis.referencing.crs.VerticalCRS;
 import org.opengis.referencing.operation.MathTransformFactory;
@@ -429,7 +430,7 @@ public final class WKTFormatTest extends 
EPSGDependentTestCase {
         final var pm = new DefaultPrimeMeridian(
                 Map.of(DefaultPrimeMeridian.NAME_KEY, "Invalid “$name” here"),
                 -10, Units.DEGREE);
-        format = new WKTFormat(Locale.US, null);
+        format = new WKTFormat(Locale.US, (ZoneId) null);
         final String   wkt      = format.format(pm);
         final Warnings warnings = format.getWarnings();
         assertNotNull(warnings, "warnings");
diff --git 
a/endorsed/src/org.apache.sis.storage.geotiff/main/org/apache/sis/storage/geotiff/GeoTiffStore.java
 
b/endorsed/src/org.apache.sis.storage.geotiff/main/org/apache/sis/storage/geotiff/GeoTiffStore.java
index 5abdde61d1..23303078b0 100644
--- 
a/endorsed/src/org.apache.sis.storage.geotiff/main/org/apache/sis/storage/geotiff/GeoTiffStore.java
+++ 
b/endorsed/src/org.apache.sis.storage.geotiff/main/org/apache/sis/storage/geotiff/GeoTiffStore.java
@@ -23,6 +23,7 @@ import java.util.TimeZone;
 import java.util.Optional;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
+import java.time.ZoneId;
 import java.net.URI;
 import java.io.IOException;
 import java.nio.charset.Charset;
@@ -124,7 +125,7 @@ public class GeoTiffStore extends DataStore implements 
Aggregate {
     /**
      * The timezone for the date and time parsing, or {@code null} for the 
default.
      */
-    private final TimeZone timezone;
+    private final ZoneId timezone;
 
     /**
      * The object to use for parsing and formatting dates. Created when first 
needed.
@@ -508,7 +509,7 @@ public class GeoTiffStore extends DataStore implements 
Aggregate {
         if (dateFormat == null) {
             dateFormat = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss", 
Locale.US);
             if (timezone != null) {
-                dateFormat.setTimeZone(timezone);
+                dateFormat.setTimeZone(TimeZone.getTimeZone(timezone));
             }
         }
         return dateFormat;
diff --git 
a/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/GridMapping.java
 
b/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/GridMapping.java
index 45015c40de..bc1f628017 100644
--- 
a/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/GridMapping.java
+++ 
b/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/GridMapping.java
@@ -22,7 +22,6 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Locale;
-import java.util.TimeZone;
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
 import java.util.function.Supplier;
@@ -567,7 +566,7 @@ final class GridMapping {
      * The WKT is presumed to use the GDAL flavor of WKT 1, and warnings are 
redirected to decoder listeners.
      */
     private CoordinateReferenceSystem createFromWKT(final String wkt) throws 
ParseException {
-        final var f = new WKTFormat(Decoder.DATA_LOCALE, 
TimeZone.getTimeZone(mapping.decoder.getTimeZone()));
+        final var f = new WKTFormat(Decoder.DATA_LOCALE, 
mapping.decoder.getTimeZone());
         f.setConvention(org.apache.sis.io.wkt.Convention.WKT1_COMMON_UNITS);
         final var parsed = (CoordinateReferenceSystem) f.parseObject(wkt);
         final Warnings warnings = f.getWarnings();
diff --git 
a/endorsed/src/org.apache.sis.storage.xml/main/org/apache/sis/storage/xml/stream/StaxDataStore.java
 
b/endorsed/src/org.apache.sis.storage.xml/main/org/apache/sis/storage/xml/stream/StaxDataStore.java
index f07e8e7833..27d65b56a7 100644
--- 
a/endorsed/src/org.apache.sis.storage.xml/main/org/apache/sis/storage/xml/stream/StaxDataStore.java
+++ 
b/endorsed/src/org.apache.sis.storage.xml/main/org/apache/sis/storage/xml/stream/StaxDataStore.java
@@ -17,10 +17,10 @@
 package org.apache.sis.storage.xml.stream;
 
 import java.util.Locale;
-import java.util.TimeZone;
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
 import java.util.logging.Filter;
+import java.time.ZoneId;
 import java.io.Closeable;
 import java.io.IOException;
 import java.io.InputStream;
@@ -77,7 +77,7 @@ public abstract class StaxDataStore extends URIDataStore {
      *
      * @see OptionKey#TIMEZONE
      */
-    protected final TimeZone timezone;
+    protected final ZoneId timezone;
 
     /**
      * The character encoding of the file content, or {@code null} if 
unspecified.
diff --git 
a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/URIDataStore.java
 
b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/URIDataStore.java
index 0be020891b..bcd4ff3af0 100644
--- 
a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/URIDataStore.java
+++ 
b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/base/URIDataStore.java
@@ -21,9 +21,9 @@ import java.util.HashMap;
 import java.util.Arrays;
 import java.util.Optional;
 import java.util.Locale;
-import java.util.TimeZone;
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
+import java.time.ZoneId;
 import java.io.BufferedWriter;
 import java.io.BufferedInputStream;
 import java.io.InputStream;
@@ -106,7 +106,7 @@ public abstract class URIDataStore extends DataStore 
implements StoreResource {
      * User-specified timezone for dates, or {@code null} for UTC.
      * Subclasses may replace this value by a value read from the data file.
      */
-    protected TimeZone timezone;
+    protected ZoneId timezone;
 
     /**
      * Creates a new data store. This constructor does not open the file,
diff --git 
a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/folder/Store.java
 
b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/folder/Store.java
index 62fbf4df1c..c172a021c7 100644
--- 
a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/folder/Store.java
+++ 
b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/folder/Store.java
@@ -21,10 +21,10 @@ import java.util.List;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Locale;
-import java.util.TimeZone;
 import java.util.Optional;
 import java.util.logging.Level;
 import java.util.concurrent.ConcurrentHashMap;
+import java.time.ZoneId;
 import java.io.IOException;
 import java.io.UncheckedIOException;
 import java.nio.charset.Charset;
@@ -205,9 +205,9 @@ class Store extends DataStore implements StoreResource, 
UnstructuredAggregate, D
         final String format = StoreUtilities.getFormatName(componentProvider);
         final ParameterValueGroup pg = (provider != null ? 
provider.getOpenParameters() : StoreProvider.PARAMETERS).createValue();
         pg.parameter(DataStoreProvider.LOCATION).setValue(location);
-        Locale   locale   = configuration.getOption(OptionKey.LOCALE);
-        TimeZone timezone = configuration.getOption(OptionKey.TIMEZONE);
-        Charset  encoding = configuration.getOption(OptionKey.ENCODING);
+        Locale  locale   = configuration.getOption(OptionKey.LOCALE);
+        ZoneId  timezone = configuration.getOption(OptionKey.TIMEZONE);
+        Charset encoding = configuration.getOption(OptionKey.ENCODING);
         if (locale   != null) pg.parameter("locale"  ).setValue(locale  );
         if (timezone != null) pg.parameter("timezone").setValue(timezone);
         if (encoding != null) pg.parameter("encoding").setValue(encoding);
diff --git 
a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/folder/StoreProvider.java
 
b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/folder/StoreProvider.java
index dd72fe7799..d6534556e0 100644
--- 
a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/folder/StoreProvider.java
+++ 
b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/folder/StoreProvider.java
@@ -18,8 +18,8 @@ package org.apache.sis.storage.folder;
 
 import java.util.EnumSet;
 import java.util.Locale;
-import java.util.TimeZone;
 import java.util.logging.Logger;
+import java.time.ZoneId;
 import java.io.IOException;
 import java.nio.charset.Charset;
 import java.nio.file.Path;
@@ -84,7 +84,7 @@ public final class StoreProvider extends DataStoreProvider {
     /**
      * Description of the parameter for timezone of dates in the data store.
      */
-    private static final ParameterDescriptor<TimeZone> TIMEZONE;
+    private static final ParameterDescriptor<ZoneId> TIMEZONE;
 
     /**
      * Description of the parameter for character encoding used by the data 
store.
@@ -107,7 +107,7 @@ public final class StoreProvider extends DataStoreProvider {
         final InternationalString remark = 
Resources.formatInternational(Resources.Keys.UsedOnlyIfNotEncoded);
         ENCODING   = annotate(builder, URIDataStoreProvider.ENCODING, remark);
         LOCALE     = builder.addName("locale"  
).setDescription(Resources.formatInternational(Resources.Keys.DataStoreLocale  
)).setRemarks(remark).create(Locale.class,   null);
-        TIMEZONE   = 
builder.addName("timezone").setDescription(Resources.formatInternational(Resources.Keys.DataStoreTimeZone)).setRemarks(remark).create(TimeZone.class,
 null);
+        TIMEZONE   = 
builder.addName("timezone").setDescription(Resources.formatInternational(Resources.Keys.DataStoreTimeZone)).setRemarks(remark).create(ZoneId.class,
 null);
         FORMAT     = builder.addName("format"  
).setDescription(Resources.formatInternational(Resources.Keys.DirectoryContentFormatName)).create(String.class,
 null);
         location   = new 
ParameterBuilder(URIDataStoreProvider.LOCATION_PARAM).create(Path.class, null);
         PARAMETERS = builder.addName(NAME).createGroup(location, LOCALE, 
TIMEZONE, ENCODING, FORMAT, URIDataStoreProvider.CREATE_PARAM);
diff --git 
a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/wkt/StoreFormat.java
 
b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/wkt/StoreFormat.java
index fc3a29b6d7..73842aa99e 100644
--- 
a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/wkt/StoreFormat.java
+++ 
b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/wkt/StoreFormat.java
@@ -17,8 +17,8 @@
 package org.apache.sis.storage.wkt;
 
 import java.text.ParseException;
+import java.time.ZoneId;
 import java.util.Locale;
-import java.util.TimeZone;
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
 import org.opengis.geometry.Geometry;
@@ -67,7 +67,7 @@ public final class StoreFormat extends WKTFormat {
      * @param  library    the geometry library, or {@code null} for the 
default.
      * @param  listeners  where to send warnings.
      */
-    public StoreFormat(final Locale locale, final TimeZone timezone,
+    public StoreFormat(final Locale locale, final ZoneId timezone,
                        final GeometryLibrary library, final StoreListeners 
listeners)
     {
         super(locale, timezone);
diff --git 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/setup/OptionKey.java 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/setup/OptionKey.java
index d98fea5257..509985913f 100644
--- a/endorsed/src/org.apache.sis.util/main/org/apache/sis/setup/OptionKey.java
+++ b/endorsed/src/org.apache.sis.util/main/org/apache/sis/setup/OptionKey.java
@@ -19,8 +19,8 @@ package org.apache.sis.setup;
 import java.util.Map;
 import java.util.HashMap;
 import java.util.Locale;
-import java.util.TimeZone;
 import java.util.Objects;
+import java.time.ZoneId;
 import java.nio.ByteBuffer;
 import java.io.Serializable;
 import java.io.ObjectStreamException;
@@ -93,18 +93,13 @@ public class OptionKey<T> implements Serializable {
     /**
      * The timezone to use when parsing or formatting dates and times without 
explicit timezone.
      * If this option is not provided, then the default value is format 
specific.
-     * That default is often, but not necessarily, the {@linkplain 
TimeZone#getDefault() platform default}.
-     *
-     * <div class="warning"><b>Upcoming API change — Java time API</b>:
-     * the type may be changed to {@link java.time.ZoneId} in a future version.
-     * This change may be applied in synchronization with GeoAPI 4.0.
-     * </div>
+     * That default is often, but not necessarily, the {@linkplain 
ZoneId#systemDefault() platform default}.
      *
      * @see org.apache.sis.xml.XML#TIMEZONE
      *
      * @since 0.8
      */
-    public static final OptionKey<TimeZone> TIMEZONE = new 
OptionKey<>("TIMEZONE", TimeZone.class);
+    public static final OptionKey<ZoneId> TIMEZONE = new 
OptionKey<>("TIMEZONE", ZoneId.class);
 
     /**
      * The character encoding of document content.
diff --git 
a/incubator/src/org.apache.sis.storage.shapefile/main/org/apache/sis/storage/shapefile/ShapefileStore.java
 
b/incubator/src/org.apache.sis.storage.shapefile/main/org/apache/sis/storage/shapefile/ShapefileStore.java
index 19e8bef9f8..8589e3280a 100644
--- 
a/incubator/src/org.apache.sis.storage.shapefile/main/org/apache/sis/storage/shapefile/ShapefileStore.java
+++ 
b/incubator/src/org.apache.sis.storage.shapefile/main/org/apache/sis/storage/shapefile/ShapefileStore.java
@@ -174,8 +174,7 @@ public final class ShapefileStore extends DataStore 
implements WritableFeatureSe
     public ShapefileStore(StorageConnector cnx) throws 
IllegalArgumentException, DataStoreException {
         this.shpPath = cnx.getStorageAs(Path.class);
         this.userDefinedCharSet = cnx.getOption(OptionKey.ENCODING);
-        var tz = cnx.getOption(OptionKey.TIMEZONE);
-        this.timezone = (tz != null) ? tz.toZoneId() : null;
+        this.timezone = cnx.getOption(OptionKey.TIMEZONE);
         this.files = new ShpFiles(shpPath);
     }
 
diff --git 
a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/referencing/WKTPane.java
 
b/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/referencing/WKTPane.java
index 7d9622e9ba..2818320b00 100644
--- 
a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/referencing/WKTPane.java
+++ 
b/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/referencing/WKTPane.java
@@ -18,6 +18,7 @@ package org.apache.sis.gui.referencing;
 
 import java.util.EnumMap;
 import java.util.Locale;
+import java.time.ZoneId;
 import javafx.beans.value.ChangeListener;
 import javafx.beans.value.ObservableValue;
 import javafx.collections.FXCollections;
@@ -83,7 +84,7 @@ final class WKTPane extends StringConverter<Convention> 
implements ChangeListene
         for (final Convention c : sc) {
             conventionTexts.put(c, toString(c, vocabulary));
         }
-        format = new WKTFormat(locale, null);
+        format = new WKTFormat(locale, (ZoneId) null);
         format.setConvention(Convention.WKT2_SIMPLIFIED);
         convention = new ChoiceBox<>(FXCollections.observableArrayList(sc));
         convention.setConverter(this);
diff --git 
a/optional/src/org.apache.sis.storage.gdal/main/org/apache/sis/storage/gdal/GDALStore.java
 
b/optional/src/org.apache.sis.storage.gdal/main/org/apache/sis/storage/gdal/GDALStore.java
index d1622c988d..2c15336284 100644
--- 
a/optional/src/org.apache.sis.storage.gdal/main/org/apache/sis/storage/gdal/GDALStore.java
+++ 
b/optional/src/org.apache.sis.storage.gdal/main/org/apache/sis/storage/gdal/GDALStore.java
@@ -426,7 +426,7 @@ public class GDALStore extends DataStore implements 
Aggregate {
      */
     final WKTFormat wktFormat() {
         if (wktFormat == null) {
-            wktFormat = new WKTFormat(null, null);
+            wktFormat = new WKTFormat();
             wktFormat.setConvention(Convention.WKT1_COMMON_UNITS);
         }
         return wktFormat;


Reply via email to