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)));
+ }
+
+
}