You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2022/08/02 14:08:04 UTC

[isis] branch master updated: ISIS-3105: ZoneOffset.UTC and ZoneId.of("UTC") result in different output format;

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

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 810e78e701 ISIS-3105: ZoneOffset.UTC and ZoneId.of("UTC") result in different output format;
810e78e701 is described below

commit 810e78e70111af992c13496905023d47d684ab67
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Aug 2 16:07:56 2022 +0200

    ISIS-3105: ZoneOffset.UTC and ZoneId.of("UTC") result in different
    output format;
    
    - that is 'Z' vs 'UTC'
    
    - so we prefer to use ZoneId.of("UTC") for UTC based ZoneDateTime values
---
 .../value/semantics/ValueSemanticsAbstract.java    | 17 +++-------------
 .../isis/commons/internal/base/_Temporals.java     | 23 ++++++++++++++++++----
 .../isis/commons/internal/base/TemporalsTest.java  | 21 +++++++++++++++++++-
 3 files changed, 42 insertions(+), 19 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsAbstract.java b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsAbstract.java
index 1902718c5e..8a91c3aada 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsAbstract.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsAbstract.java
@@ -48,11 +48,11 @@ import org.apache.isis.applib.value.semantics.TemporalValueSemantics.TemporalEdi
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.commons.internal.base._Temporals;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.schema.common.v2.ValueType;
 import org.apache.isis.schema.common.v2.ValueWithTypeDto;
 
-import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
@@ -310,25 +310,14 @@ implements
         case LOCAL:
             return Optional.empty();
         case OFFSET:
-            return Optional.of(getIsoTimeZoneOffsetFormat());
+            return Optional.of(_Temporals.ISO_OFFSET_ONLY_FORMAT);
         case ZONED:
-            return Optional.of(getLocalizedTimeZoneIdFormat(context));
+            return Optional.of(_Temporals.DEFAULT_ZONEID_ONLY_FORMAT);
         default:
             throw _Exceptions.unmatchedCase(offsetCharacteristic);
         }
     }
 
-    @Getter(lazy = true, value = AccessLevel.PROTECTED)
-    private final DateTimeFormatter isoTimeZoneOffsetFormat = new DateTimeFormatterBuilder()
-            .appendOffsetId()
-            .toFormatter(Locale.US); // arbitrarily picking a locale, just in case; (this is an ISO format)
-
-    private DateTimeFormatter getLocalizedTimeZoneIdFormat(final ValueSemanticsProvider.Context context) {
-        return new DateTimeFormatterBuilder()
-            .appendPattern("VV")
-            .toFormatter(getUserLocale(context).getTimeFormatLocale());
-    }
-
     // -- TEMPORAL FORMATTING/PARSING
 
     protected DateTimeFormatter getTemporalEditingFormat(
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/base/_Temporals.java b/commons/src/main/java/org/apache/isis/commons/internal/base/_Temporals.java
index 5c5ddcb531..2d4013295e 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/base/_Temporals.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/base/_Temporals.java
@@ -30,6 +30,8 @@ import java.time.ZoneId;
 import java.time.ZoneOffset;
 import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeFormatterBuilder;
+import java.util.Locale;
 import java.util.Optional;
 import java.util.regex.Pattern;
 
@@ -56,21 +58,22 @@ import lombok.experimental.UtilityClass;
 @UtilityClass
 public final class _Temporals {
 
+    public final ZoneId UTC = ZoneId.of("UTC");
+
     /**
      * The default date/time format (seconds resolution): {@code 'yyyy-MM-dd HH:mm:ss'}.
      * As used for auditing, session-logging, etc.
      */
-    public static final DateTimeFormatter DEFAULT_LOCAL_DATETIME_FORMATTER =
+    public final DateTimeFormatter DEFAULT_LOCAL_DATETIME_FORMATTER =
             DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
     /**
      * The default date/time format (milliseconds resolution): {@code 'yyyy-MM-dd HH:mm:ss.SSS'}.
      * As used eg. for Xray.
      */
-    public static final DateTimeFormatter DEFAULT_LOCAL_DATETIME_FORMATTER_WITH_MILLIS =
+    public final DateTimeFormatter DEFAULT_LOCAL_DATETIME_FORMATTER_WITH_MILLIS =
             DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
 
-
     /**
      * Returns duration between {@code startedAt} and {@code completedAt} in <i>seconds</i>,
      * to 3 decimal places.
@@ -86,6 +89,17 @@ public final class _Temporals {
                         : Optional.empty();
     }
 
+    // -- TIME ZONE RENDERING
+
+    public final DateTimeFormatter ISO_OFFSET_ONLY_FORMAT = new DateTimeFormatterBuilder()
+            .appendOffsetId()
+            .toFormatter(Locale.US); // arbitrarily picking a locale, just in case; (should have no effect)
+
+    public final DateTimeFormatter DEFAULT_ZONEID_ONLY_FORMAT = new DateTimeFormatterBuilder()
+            .appendPattern("VV")
+            .toFormatter(Locale.US); // arbitrarily picking a locale, just in case; (should have no effect)
+
+
     // -- TEMPORAL TO STRING CONVERTERS
 
     private static final String FRACTIONAL_SECONDS_READ_PATTERN =
@@ -178,7 +192,7 @@ public final class _Temporals {
                         ? ZonedDateTime.parse(datastoreValue, ZONEDDATETIME_DATASTORE_PARSER)
                         : ZonedDateTime.of(
                                 LocalDateTime.parse(datastoreValue,
-                                        ZONEDDATETIME_DATASTORE_PARSER), ZoneOffset.UTC)
+                                        ZONEDDATETIME_DATASTORE_PARSER), UTC)
                 : null;
     }
 
@@ -209,6 +223,7 @@ public final class _Temporals {
         return Can.of(
                 ZonedDateTime.of(localNow, ZoneId.of("Europe/Paris")),
                 ZonedDateTime.of(localNow, ZoneOffset.UTC),
+                ZonedDateTime.of(localNow, ZoneId.of("UTC")),
                 ZonedDateTime.of(localNow, ZoneOffset.ofHours(2)),
                 ZonedDateTime.of(localNow, ZoneOffset.ofHours(-2)).plusDays(2).plusSeconds(15));
     }
diff --git a/commons/src/test/java/org/apache/isis/commons/internal/base/TemporalsTest.java b/commons/src/test/java/org/apache/isis/commons/internal/base/TemporalsTest.java
index e14eb41825..fc381e2c82 100644
--- a/commons/src/test/java/org/apache/isis/commons/internal/base/TemporalsTest.java
+++ b/commons/src/test/java/org/apache/isis/commons/internal/base/TemporalsTest.java
@@ -22,6 +22,7 @@ import java.time.LocalDate;
 import java.time.LocalTime;
 import java.time.OffsetDateTime;
 import java.time.OffsetTime;
+import java.time.ZoneId;
 import java.time.ZoneOffset;
 import java.time.ZonedDateTime;
 
@@ -71,8 +72,26 @@ class TemporalsTest {
     @Test
     void incompleteZonedDateTime() {
         assertEquals(
-                ZonedDateTime.of(LocalDate.of(2022, 1, 28), LocalTime.of(12, 31), ZoneOffset.UTC),
+                ZonedDateTime.of(LocalDate.of(2022, 1, 28), LocalTime.of(12, 31), _Temporals.UTC),
                 _Temporals.destringAsZonedDateTime("2022-01-28 12:31:00.0"));
     }
 
+    @Test
+    void timeZoneRendering() {
+
+        // given
+        val dummyDate = LocalDate.of(2022, 1, 28);
+        val dummyTime = LocalTime.of(12, 31);
+        val formatter = _Temporals.DEFAULT_ZONEID_ONLY_FORMAT;
+
+        // then
+        assertEquals(
+                "Europe/Vienna",
+                formatter.format(ZonedDateTime.of(dummyDate, dummyTime, ZoneId.of("Europe/Vienna"))));
+        assertEquals(
+                "UTC",
+                formatter.format(ZonedDateTime.of(dummyDate, dummyTime, _Temporals.UTC)));
+    }
+
+
 }