diff --git a/CHANGELOG.md b/CHANGELOG.md
index bd937fdf..fe617e2f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -34,6 +34,9 @@ will use `Uniqueness.NONE`. This class's documentation was also updated to provi
Updated `AttributeDefinition.toString()` to print a JSON model of the object to be consistent with
all other SCIM objects in the library.
+Updated `DateTimeUtils.parse()` to support date strings without timestamps (e.g., "1970-01-01").
+The time values will always be set to the start of the day.
+
## 6.0.0 - 2026-May-11
The UnboundID SCIM SDK has been updated to use version 3 of the Jackson library (this release ships
with v3.1.3). This change aligns the SCIM SDK with HTTP libraries such as Spring Framework 7/Spring
diff --git a/scim2-sdk-common/src/main/java/com/unboundid/scim2/common/utils/DateTimeUtils.java b/scim2-sdk-common/src/main/java/com/unboundid/scim2/common/utils/DateTimeUtils.java
index 226fdf65..fcc670c1 100644
--- a/scim2-sdk-common/src/main/java/com/unboundid/scim2/common/utils/DateTimeUtils.java
+++ b/scim2-sdk-common/src/main/java/com/unboundid/scim2/common/utils/DateTimeUtils.java
@@ -32,14 +32,18 @@
package com.unboundid.scim2.common.utils;
import com.unboundid.scim2.common.annotations.NotNull;
-import java.time.DateTimeException;
+import java.time.LocalDate;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalAccessor;
+import java.time.temporal.TemporalQueries;
import java.util.Calendar;
import java.util.Date;
+import java.util.Objects;
import java.util.TimeZone;
+import static java.time.format.DateTimeFormatter.ISO_DATE;
import static java.time.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME;
/**
@@ -47,6 +51,16 @@
* type is defined as a valid {@code xsd:dateTime} in
*
* RFC 7643, section 2.3.5.
+ *
+ *
+ * This class is primarily used during JSON deserialization of date-time values
+ * within this SDK. However, it may be used as a general utility class to
+ * perform conversions between date-time strings (e.g., "1970-01-01T00:00:00Z")
+ * and Java objects. The primary entry points to this class are:
+ *
+ * - {@link #parse(String)}: Converts a timestamp string to a Java object.
+ *
- {@link #format(Calendar) format()}: Converts an object to a string.
+ *
*/
public final class DateTimeUtils
{
@@ -135,23 +149,13 @@ public static String format(@NotNull final Calendar calendar)
* @param dateStr A SCIM 2 DateTime string.
* @return The DateTime string as a Calendar value.
* @throws IllegalArgumentException if the string cannot be parsed as an
- * xsd:dateTime value.
+ * {@code xsd:dateTime} value.
*/
@NotNull
public static Calendar parse(@NotNull final String dateStr)
throws IllegalArgumentException
{
- OffsetDateTime parsedTime;
- try
- {
- parsedTime = OffsetDateTime.parse(dateStr);
- }
- catch (DateTimeException e)
- {
- // Re-throw as an IllegalArgumentException for backward compatibility with
- // previous releases of the SCIM SDK.
- throw new IllegalArgumentException(e);
- }
+ OffsetDateTime parsedTime = asOffsetDateTime(dateStr);
// In previous releases, the default region was "GMT+00:00".
ZoneOffset offset = parsedTime.getOffset();
@@ -159,7 +163,7 @@ public static Calendar parse(@NotNull final String dateStr)
? GMT : TimeZone.getTimeZone(offset);
Calendar calendar = Calendar.getInstance(zone);
- calendar.setTime(Date.from(parsedTime.toInstant()));
+ calendar.setTimeInMillis(parsedTime.toInstant().toEpochMilli());
return calendar;
}
@@ -180,4 +184,38 @@ public static Calendar parse(final long timestampMillis)
c.setTimeInMillis(timestampMillis);
return c;
}
+
+ /**
+ * Converts the provided string timestamp into a Java object.
+ */
+ @NotNull
+ private static OffsetDateTime asOffsetDateTime(@NotNull final String dateStr)
+ throws IllegalArgumentException
+ {
+ Exception original;
+ try
+ {
+ // Parse timestamps of the form: 1970-01-01T00:00:00Z
+ return OffsetDateTime.parse(dateStr);
+ }
+ catch (Exception e)
+ {
+ original = e;
+ }
+
+ try
+ {
+ // Fall back to a date parser without a time: 1970-01-01
+ TemporalAccessor parsedDate = ISO_DATE.parse(dateStr);
+ ZoneOffset offset = Objects.requireNonNullElse(
+ parsedDate.query(TemporalQueries.offset()), ZoneOffset.UTC);
+
+ return LocalDate.from(parsedDate).atStartOfDay().atOffset(offset);
+ }
+ catch (Exception e)
+ {
+ // Use the original exception, as it is more likely to have relevant info.
+ throw new IllegalArgumentException(original);
+ }
+ }
}
diff --git a/scim2-sdk-common/src/test/java/com/unboundid/scim2/common/DateTimeUtilsTest.java b/scim2-sdk-common/src/test/java/com/unboundid/scim2/common/DateTimeUtilsTest.java
index 8f2b6ece..e4f046f4 100644
--- a/scim2-sdk-common/src/test/java/com/unboundid/scim2/common/DateTimeUtilsTest.java
+++ b/scim2-sdk-common/src/test/java/com/unboundid/scim2/common/DateTimeUtilsTest.java
@@ -56,8 +56,7 @@
*/
public class DateTimeUtilsTest
{
- // In previous releases, this was "GMT+00:00". Now it represents UTC.
- private static final TimeZone GMT = TimeZone.getTimeZone(ZoneOffset.UTC);
+ private static final TimeZone UTC = TimeZone.getTimeZone(ZoneOffset.UTC);
/**
* Reset the value of the system property.
@@ -119,9 +118,9 @@ public void testConversionToString(final String expected,
final TimeZone timezone)
{
// Serialize the object timestamp to a string. The result should match the
- // provided string representation.
+ // provided string representation in uppercase.
String computedTimestamp = DateTimeUtils.format(dateObject, timezone);
- assertThat(computedTimestamp).isEqualTo(expected);
+ assertThat(computedTimestamp).isEqualTo(expected.toUpperCase());
}
/**
@@ -157,9 +156,27 @@ public void testInvalidTimestamps(final String invalidString)
{
assertThatThrownBy(() -> DateTimeUtils.parse(invalidString))
.isInstanceOf(IllegalArgumentException.class)
+ .hasMessageFindingMatch("Invalid value for \\S+ \\(valid values \\d+ - \\d+")
.hasMessageContaining("could not be parsed");
}
+ /**
+ * Ensure a date string can be parsed.
+ *
+ * @param dateString The timestamp from the data provider.
+ * @param timestamp The expected UNIX timestamp value.
+ * @param timezone The expected timezone value.
+ */
+ @Test(dataProvider = "datesWithoutTimestamps")
+ public void testDatesWithoutTimestamps(final String dateString,
+ final long timestamp,
+ final TimeZone timezone)
+ {
+ Calendar deserialized = DateTimeUtils.parse(dateString);
+ assertThat(deserialized.getTimeInMillis()).isEqualTo(timestamp);
+ assertThat(deserialized.getTimeZone()).isEqualTo(timezone);
+ }
+
/**
* Validate the {@link DateTimeUtils#format(Date)} method. This test will only
* be run if the timezone value is UTC.
@@ -176,7 +193,7 @@ public void testUTC(final String expected,
if (timezone.getRawOffset() == 0)
{
String computedTimestamp = DateTimeUtils.format(dateObject);
- assertThat(computedTimestamp).isEqualTo(expected);
+ assertThat(computedTimestamp).isEqualTo(expected.toUpperCase());
}
}
@@ -245,6 +262,38 @@ public void testDeserialization(final String ignored,
assertThat(createdTimestamp.getTimeZone().getRawOffset()).isEqualTo(0);
}
+ /**
+ * Ensure date strings without timezones can be deserialized.
+ *
+ * @param dateString The date string value without a timestamp.
+ * @param unixTimestamp The UNIX timestamp equivalent to the date string.
+ * @param timezone The time zone of the date string.
+ */
+ @Test(dataProvider = "datesWithoutTimestamps")
+ public void testDateOnlyDeserialization(final String dateString,
+ final long unixTimestamp,
+ final TimeZone timezone)
+ {
+ String json = """
+ {
+ "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ],
+ "userName": "name",
+ "meta": {
+ "created": "%s"
+ }
+ }""".formatted(dateString);
+
+ // Deserialize the JSON into a user resource.
+ UserResource user = JsonUtils.getObjectReader().forType(UserResource.class)
+ .readValue(json);
+
+ // Ensure the value was properly deserialized.
+ Calendar expected = Calendar.getInstance(timezone);
+ expected.setTimeInMillis(unixTimestamp);
+ assertThat(user.getMeta()).isNotNull();
+ assertThat(user.getMeta().getCreated()).isEqualTo(expected);
+ }
+
/**
* Ensures an exception is thrown when a malformed timestamp is deserialized.
*/
@@ -311,8 +360,6 @@ public Object[][] invalidTimestamps()
{
return new Object[][]
{
- new String[] { "1989-03-14T17:56:47+09:999" },
- new String[] { "1989-03-14T17:56:47+99:00" },
new String[] { "1989-03-14T17:56:61+02:00" },
new String[] { "1989-03-14T17:61:47+02:00" },
new String[] { "1989-03-14T25:56:47+02:00" },
@@ -321,6 +368,31 @@ public Object[][] invalidTimestamps()
};
}
+ /**
+ * A data provider representing string timestamps that only contain dates.
+ *
+ * @return A set of date strings.
+ */
+ @DataProvider(name = "datesWithoutTimestamps")
+ public Object[][] datesWithoutTimestamps()
+ {
+ return new Object[][]
+ {
+ { "1970-01-01", 0L, UTC },
+ { "1970-01-01Z", 0L, UTC },
+ { "1970-01-01+05:00", -18000000L, zone(5) },
+ { "1970-01-01-05:00", 18000000L, zone(-5) },
+ { "2079-10-18", 3464812800000L, UTC },
+ { "2098-06-17", 4053801600000L, UTC },
+ { "2076-12-31", 3376598400000L, UTC },
+ { "2021-04-30", 1619740800000L, UTC },
+ { "1974-04-09", 134697600000L, UTC },
+ { "2061-12-11", 2901484800000L, UTC },
+ { "1955-01-22", -471571200000L, UTC },
+ { "1955-01-22+09:00", -471603600000L, zone(9) },
+ };
+ }
+
/**
* A data provider for test cases that each describe:
*
@@ -338,28 +410,28 @@ public Object[][] timestampTestCases()
return new Object[][]
{
// Basic test cases.
- testcase("1970-01-01T00:00:00Z", 0L, GMT),
- testcase("1970-01-01T00:00:01Z", 1000L, GMT),
- testcase("1970-01-01T01:00:00Z", 3600000L, GMT),
+ testcase("1970-01-01T00:00:00Z", 0L, UTC),
+ testcase("1970-01-01T00:00:01Z", 1000L, UTC),
+ testcase("1970-01-01T01:00:00Z", 3600000L, UTC),
testcase("2079-10-18T08:53:50+01:00", 3464841230000L, zone(1)),
testcase("2098-06-17T20:13:43-01:00", 4053878023000L, zone(-1)),
- testcase("2076-12-31T22:37:36Z", 3376679856000L, GMT),
- testcase("2021-04-30T11:09:27Z", 1619780967000L, GMT),
- testcase("1974-04-09T06:41:08Z", 134721668000L, GMT),
- testcase("2061-12-11T01:53:11.013Z", 2901491591013L, GMT),
- testcase("2061-12-11T01:53:11.100Z", 2901491591100L, GMT),
- testcase("2061-12-11T01:53:11.120Z", 2901491591120L, GMT),
+ testcase("2076-12-31T22:37:36Z", 3376679856000L, UTC),
+ testcase("2021-04-30T11:09:27Z", 1619780967000L, UTC),
+ testcase("1974-04-09T06:41:08Z", 134721668000L, UTC),
+ testcase("2061-12-11T01:53:11.013Z", 2901491591013L, UTC),
+ testcase("2061-12-11T01:53:11.100Z", 2901491591100L, UTC),
+ testcase("2061-12-11T01:53:11.120Z", 2901491591120L, UTC),
// This timestamp value comes from RFC 7643.
- testcase("2008-01-23T04:56:22Z", 1201064182000L, GMT),
+ testcase("2008-01-23T04:56:22Z", 1201064182000L, UTC),
// Timestamps representing values beyond the 21st century.
- testcase("2151-01-22T09:00:00Z", 5713664400000L, GMT),
- testcase("2451-01-22T09:00:00Z", 15180771600000L, GMT),
- testcase("3000-01-22T09:00:00Z", 32505526800000L, GMT),
+ testcase("2151-01-22T09:00:00Z", 5713664400000L, UTC),
+ testcase("2451-01-22T09:00:00Z", 15180771600000L, UTC),
+ testcase("3000-01-22T09:00:00Z", 32505526800000L, UTC),
// A timestamp representing a value before the epoch.
- testcase("1955-01-22T09:00:00Z", -471538800000L, GMT),
+ testcase("1955-01-22T09:00:00Z", -471538800000L, UTC),
// These represent values before and after Daylight Savings Time
// started in the US Central Time Zone in 2025. This occurred at
@@ -375,12 +447,15 @@ public Object[][] timestampTestCases()
// Test a non-standard value for a timezone.
testcase("2079-10-18T08:53:50-11:07", 3464884850000L, zone(-11, -7)),
+ // RFC 7643 states that "A date time... has no case sensitivity".
+ testcase("2079-10-18t08:53:50-08:00", 3464873630000L, zone(-8)),
+ testcase("2098-06-17T20:13:43z", 4053874423000L, UTC),
+ testcase("2098-06-17t20:13:43z", 4053874423000L, UTC),
+
// Additional test cases.
- testcase("2079-10-18T08:53:50-08:00", 3464873630000L, zone(-8)),
- testcase("2098-06-17T20:13:43Z", 4053874423000L, GMT),
testcase("2076-12-31T22:37:36.141+05:30", 3376660056141L, zone(5, 30)),
testcase("2021-04-30T11:09:27+10:00", 1619744967000L, zone(10)),
- testcase("1974-04-09T06:41:08Z", 134721668000L, GMT),
+ testcase("1974-04-09T06:41:08Z", 134721668000L, UTC),
testcase("2093-02-23T19:17:56-09:30", 3886289276000L, zone(-9, -30)),
testcase("2030-11-02T23:43:07-02:00", 1919900587000L, zone(-2)),
testcase("2077-04-04T01:01:07+04:30", 3384707467000L, zone(4, 30)),
@@ -391,22 +466,22 @@ public Object[][] timestampTestCases()
testcase("2065-02-03T22:36:54+03:30", 3000913614000L, zone(3, 30)),
testcase("2048-10-02T05:48:27+08:00", 2485201707000L, zone(8)),
testcase("2000-03-12T03:18:16+13:00", 952784296000L, zone(13)),
- testcase("2060-03-05T22:42:28Z", 2845752148000L, GMT),
+ testcase("2060-03-05T22:42:28Z", 2845752148000L, UTC),
testcase("2034-05-20T21:08:56-05:00", 2031790136000L, zone(-5)),
testcase("2058-05-04T15:06:54+02:00", 2787743214000L, zone(2)),
testcase("2027-07-12T06:04:43+06:30", 1815348883000L, zone(6, 30)),
testcase("2016-01-04T11:25:27+12:00", 1451863527000L, zone(12)),
- testcase("1990-07-05T21:43:13Z", 647214193000L, GMT),
+ testcase("1990-07-05T21:43:13Z", 647214193000L, UTC),
testcase("1986-03-29T03:51:45-07:00", 512477505000L, zone(-7)),
- testcase("2009-04-04T06:21:56Z", 1238826116000L, GMT),
+ testcase("2009-04-04T06:21:56Z", 1238826116000L, UTC),
testcase("1982-05-03T17:49:57.941+05:45", 389275497941L, zone(5, 45)),
testcase("2007-04-29T13:26:22+10:30", 1177815382000L, zone(10, 30)),
- testcase("2077-01-08T18:28:11Z", 3377356091000L, GMT),
+ testcase("2077-01-08T18:28:11Z", 3377356091000L, UTC),
testcase("2075-03-07T06:25:59-09:00", 3319197959000L, zone(-9)),
testcase("2016-08-16T10:51:47-02:00", 1471351907000L, zone(-2)),
testcase("1993-11-30T17:56:47+05:00", 754664207000L, zone(5)),
testcase("2042-04-27T03:48:45+09:30", 2282149125000L, zone(9, 30)),
- testcase("2088-06-16T23:14:34Z", 3738266074000L, GMT),
+ testcase("2088-06-16T23:14:34Z", 3738266074000L, UTC),
testcase("1970-03-31T02:40:25-10:00", 7735225000L, zone(-10)),
testcase("2011-11-06T18:06:14-03:00", 1320613574000L, zone(-3)),
testcase("2049-07-24T21:40:43+04:00", 2510761243000L, zone(4)),
@@ -418,22 +493,22 @@ public Object[][] timestampTestCases()
testcase("1981-08-21T05:36:43+03:30", 367207603000L, zone(3, 30)),
testcase("2039-08-07T16:15:52+07:00", 2196321352000L, zone(7)),
testcase("1978-04-25T07:29:47+12:45", 262291487000L, zone(12, 45)),
- testcase("2046-06-09T03:51:29Z", 2412129089000L, GMT),
+ testcase("2046-06-09T03:51:29Z", 2412129089000L, UTC),
testcase("1996-03-09T02:26:40-06:00", 826360000000L, zone(-6)),
testcase("1983-01-10T12:03:21+02:00", 411041001000L, zone(2)),
testcase("2084-05-04T17:02:12+06:00", 3608276532000L, zone(6)),
testcase("1995-09-16T20:03:15+11:00", 811242195000L, zone(11)),
- testcase("1983-04-22T18:02:51Z", 419882571000L, GMT),
+ testcase("1983-04-22T18:02:51Z", 419882571000L, UTC),
testcase("2070-10-02T00:31:16-08:00", 3179464276000L, zone(-8)),
- testcase("2078-03-08T02:50:24Z", 3413933424000L, GMT),
+ testcase("2078-03-08T02:50:24Z", 3413933424000L, UTC),
testcase("1993-05-29T00:46:46.523+05:45", 738615706523L, zone(5, 45)),
testcase("2066-12-02T09:29:02+10:00", 3058471742000L, zone(10)),
- testcase("2030-07-23T06:32:51Z", 1911018771000L, GMT),
+ testcase("2030-07-23T06:32:51Z", 1911018771000L, UTC),
testcase("2048-03-17T05:02:02-09:30", 2468068322000L, zone(-9, -30)),
testcase("1976-02-10T11:43:33-02:00", 192807813000L, zone(-2)),
testcase("1987-03-12T13:51:45+05:00", 542537505000L, zone(5)),
testcase("2030-05-30T15:18:38+09:00", 1906352318000L, zone(9)),
- testcase("2054-10-23T13:54:15Z", 2676376455000L, GMT),
+ testcase("2054-10-23T13:54:15Z", 2676376455000L, UTC),
testcase("2020-06-02T22:32:57-11:00", 1591176777000L, zone(-11)),
testcase("1973-08-02T19:59:07-03:30", 113182147000L, zone(-3, -30)),
testcase("2086-10-02T05:54:43+04:00", 3684362083000L, zone(4)),
@@ -444,18 +519,18 @@ public Object[][] timestampTestCases()
testcase("2066-10-14T16:56:23+03:00", 3054290183000L, zone(3)),
testcase("2095-01-23T20:13:54+06:30", 3946628634000L, zone(6, 30)),
testcase("2047-02-18T09:36:33+12:00", 2434052193000L, zone(12)),
- testcase("2055-05-15T20:40:48Z", 2694026448000L, GMT),
+ testcase("2055-05-15T20:40:48Z", 2694026448000L, UTC),
testcase("2079-11-09T23:17:50-07:00", 3466822670000L, zone(-7)),
testcase("2064-11-05T03:07:27-06:00", 2993101647000L, zone(-6)),
testcase("2095-08-05T15:13:38+01:00", 3963392018000L, zone(1)),
testcase("2082-12-01T04:56:39+06:00", 3563304999000L, zone(6)),
testcase("2006-08-23T20:36:32+11:00", 1156325792000L, zone(11)),
- testcase("2079-12-19T19:16:27Z", 3470238987000L, GMT),
+ testcase("2079-12-19T19:16:27Z", 3470238987000L, UTC),
testcase("2039-02-06T10:16:01-08:00", 2180628961000L, zone(-8)),
testcase("2068-08-10T08:11:27-01:00", 3111815487000L, zone(-1)),
testcase("1975-03-15T20:31:50+05:30", 164127710000L, zone(5, 30)),
testcase("2024-08-20T22:47:09+10:00", 1724158029000L, zone(10)),
- testcase("2035-06-16T14:53:12Z", 2065618392000L, GMT),
+ testcase("2035-06-16T14:53:12Z", 2065618392000L, UTC),
testcase("2014-10-08T08:41:01-09:30", 1412791861000L, zone(-9, -30)),
testcase("2030-09-03T10:15:14-02:00", 1914668114000L, zone(-2)),
testcase("2008-12-29T11:54:51+04:30", 1230535491000L, zone(4, 30)),
@@ -466,22 +541,22 @@ public Object[][] timestampTestCases()
testcase("1975-03-20T11:01:09+03:30", 164532669000L, zone(3, 30)),
testcase("2084-06-11T01:46:57+08:00", 3611497617000L, zone(8)),
testcase("1984-04-27T08:51:42+12:45", 451858002000L, zone(12, 45)),
- testcase("2015-07-12T01:02:05Z", 1436662925000L, GMT),
+ testcase("2015-07-12T01:02:05Z", 1436662925000L, UTC),
testcase("2024-08-21T22:35:55-05:00", 1724297755000L, zone(-5)),
testcase("1986-06-16T08:31:08+02:00", 519287468000L, zone(2)),
testcase("1975-12-13T21:41:37+06:30", 187715497000L, zone(6, 30)),
testcase("2024-10-30T03:46:02+12:00", 1730216762000L, zone(12)),
- testcase("2004-03-20T07:15:19Z", 1079766919000L, GMT),
+ testcase("2004-03-20T07:15:19Z", 1079766919000L, UTC),
testcase("2090-01-18T20:11:46-07:00", 3788478706000L, zone(-7)),
- testcase("1981-06-30T09:24:33Z", 362741073000L, GMT),
+ testcase("1981-06-30T09:24:33Z", 362741073000L, UTC),
testcase("2004-01-18T00:44:55+05:45", 1074365995000L, zone(5, 45)),
testcase("2066-06-08T19:13:54+10:30", 3043212234000L, zone(10, 30)),
- testcase("1986-10-12T00:36:42Z", 529461402000L, GMT),
+ testcase("1986-10-12T00:36:42Z", 529461402000L, UTC),
testcase("2046-06-18T09:49:07-09:00", 2412960547000L, zone(-9)),
testcase("2022-09-14T05:44:15-02:00", 1663141455000L, zone(-2)),
testcase("2083-01-09T01:14:06+05:00", 3566664846000L, zone(5)),
testcase("1990-12-16T12:41:53+09:30", 661317113000L, zone(9, 30)),
- testcase("2078-10-20T13:45:34Z", 3433499134000L, GMT),
+ testcase("2078-10-20T13:45:34Z", 3433499134000L, UTC),
testcase("2019-05-15T21:01:27-10:00", 1557990087000L, zone(-10)),
testcase("2068-06-27T22:27:16-10:00", 3108097636000L, zone(-10)),
testcase("2028-08-27T04:32:27-03:00", 1850974347000L, zone(-3)),
@@ -493,44 +568,44 @@ public Object[][] timestampTestCases()
testcase("2027-05-18T11:09:59+03:30", 1810625999000L, zone(3, 30)),
testcase("1982-11-27T10:06:43+07:00", 407214403000L, zone(7)),
testcase("2098-08-26T01:55:32+12:45", 4059810632000L, zone(12, 45)),
- testcase("2052-08-09T12:02:07Z", 2606817727000L, GMT),
+ testcase("2052-08-09T12:02:07Z", 2606817727000L, UTC),
testcase("1996-02-20T09:10:36-06:00", 824829036000L, zone(-6)),
testcase("2092-05-18T14:38:50+02:00", 3861952730000L, zone(2)),
testcase("2019-07-01T03:38:37+06:00", 1561930717000L, zone(6)),
testcase("1974-10-02T06:17:41+11:00", 149887061000L, zone(11)),
- testcase("2022-06-17T08:36:37Z", 1655454997000L, GMT),
+ testcase("2022-06-17T08:36:37Z", 1655454997000L, UTC),
testcase("2090-09-11T10:04:41-08:00", 3808836281000L, zone(-8)),
- testcase("1972-11-02T20:22:48Z", 89583768000L, GMT),
+ testcase("1972-11-02T20:22:48Z", 89583768000L, UTC),
testcase("1982-08-14T15:01:21+05:45", 398164581000L, zone(5, 45)),
testcase("2053-11-26T13:15:53+10:00", 2647739753000L, zone(10)),
- testcase("2022-06-13T03:27:35Z", 1655090855000L, GMT),
+ testcase("2022-06-13T03:27:35Z", 1655090855000L, UTC),
testcase("2012-08-20T03:32:24-09:30", 1345467744000L, zone(-9, -30)),
testcase("1986-09-14T17:49:27-02:00", 527111367000L, zone(-2)),
testcase("2052-04-08T02:48:19+05:00", 2596139299000L, zone(5)),
testcase("2081-07-01T19:43:31+09:00", 3518592211000L, zone(9)),
- testcase("2013-03-24T21:13:34Z", 1364159614000L, GMT),
+ testcase("2013-03-24T21:13:34Z", 1364159614000L, UTC),
testcase("2090-10-21T05:11:41-11:00", 3812285501000L, zone(-11)),
testcase("2085-03-13T16:20:16-03:30", 3635351416000L, zone(-3, -30)),
testcase("2036-12-18T14:01:30+04:00", 2113207290000L, zone(4)),
testcase("1983-06-04T11:58:34+08:00", 423547114000L, zone(8)),
testcase("2036-07-28T12:36:34+13:00", 2100814594000L, zone(13)),
- testcase("1987-06-05T14:21:08Z", 549901268000L, GMT),
+ testcase("1987-06-05T14:21:08Z", 549901268000L, UTC),
testcase("2068-11-15T09:57:24-05:00", 3120217044000L, zone(-5)),
testcase("2039-01-15T21:55:56+03:00", 2178730556000L, zone(3)),
testcase("1979-05-23T13:22:30+06:30", 296290350000L, zone(6, 30)),
testcase("2098-10-23T06:44:12+12:00", 4064841852000L, zone(12)),
testcase("1972-03-14T04:31:08+12:45", 69349568000L, zone(12, 45)),
- testcase("2062-10-14T08:16:39Z", 2928039399000L, GMT),
+ testcase("2062-10-14T08:16:39Z", 2928039399000L, UTC),
testcase("2043-06-10T07:09:09-06:00", 2317554549000L, zone(-6)),
testcase("2065-02-18T21:48:12+01:00", 3002215692000L, zone(1)),
testcase("1987-12-19T02:22:03+06:00", 566857323000L, zone(6)),
testcase("2026-02-25T21:30:39+11:00", 1772015439000L, zone(11)),
- testcase("2095-07-22T12:23:56Z", 3962175836000L, GMT),
+ testcase("2095-07-22T12:23:56Z", 3962175836000L, UTC),
testcase("2016-07-19T06:33:33-08:00", 1468938813000L, zone(-8)),
testcase("2008-12-07T13:51:55-01:00", 1228661515000L, zone(-1)),
testcase("2010-07-21T11:37:42+05:30", 1279692462000L, zone(5, 30)),
testcase("2030-02-05T04:12:24+10:00", 1896459144000L, zone(10)),
- testcase("1980-03-30T06:17:11Z", 323245031000L, GMT),
+ testcase("1980-03-30T06:17:11Z", 323245031000L, UTC),
testcase("2002-03-20T00:59:25-09:30", 1016620165000L, zone(-9, -30)),
testcase("1977-06-30T21:21:30.044-02:00", 236560890044L, zone(-2)),
testcase("1988-10-24T03:27:57+04:30", 593650677000L, zone(4, 30)),
@@ -541,23 +616,23 @@ public Object[][] timestampTestCases()
testcase("2075-10-26T21:58:46+03:30", 3339340126000L, zone(3, 30)),
testcase("2077-10-02T18:13:23+08:00", 3400395203000L, zone(8)),
testcase("2065-04-12T00:47:35+12:45", 3006676955000L, zone(12, 45)),
- testcase("2073-08-24T01:36:48Z", 3270764208000L, GMT),
+ testcase("2073-08-24T01:36:48Z", 3270764208000L, UTC),
testcase("2015-02-25T21:13:27-05:00", 1424916807000L, zone(-5)),
testcase("2007-10-24T22:55:23+02:00", 1193259323000L, zone(2)),
testcase("1986-01-29T21:13:52+06:30", 507393832000L, zone(6, 30)),
testcase("2058-05-02T15:42:40+11:00", 2787540160000L, zone(11)),
- testcase("1988-12-15T00:31:24Z", 598149084000L, GMT),
+ testcase("1988-12-15T00:31:24Z", 598149084000L, UTC),
testcase("2064-02-14T11:00:24-07:00", 2970237624000L, zone(-7)),
- testcase("2008-10-26T08:48:57Z", 1225010937000L, GMT),
+ testcase("2008-10-26T08:48:57Z", 1225010937000L, UTC),
testcase("2084-02-04T05:19:38+05:45", 3600459278000L, zone(5, 45)),
testcase("2093-04-03T16:51:12+10:30", 3889578072000L, zone(10, 30)),
- testcase("2020-08-03T23:51:01.001Z", 1596498661001L, GMT),
+ testcase("2020-08-03T23:51:01.001Z", 1596498661001L, UTC),
testcase("1977-06-11T18:55:13-09:00", 234935713000L, zone(-9)),
testcase("1976-08-13T17:38:50-02:00", 208813130000L, zone(-2)),
testcase("2077-01-24T16:43:25+05:00", 3378714205000L, zone(5)),
testcase("2063-06-02T02:35:06+05:30", 2947957506000L, zone(5, 30)),
testcase("2074-03-14T10:26:54+09:30", 3288214614000L, zone(9, 30)),
- testcase("2029-03-18T13:03:18Z", 1868533398000L, GMT),
+ testcase("2029-03-18T13:03:18Z", 1868533398000L, UTC),
testcase("1975-07-22T06:29:36-10:00", 175278576000L, zone(-10)),
testcase("2077-06-11T09:24:08-03:00", 3390639848000L, zone(-3)),
testcase("2054-06-24T12:44:28+04:30", 2665901668000L, zone(4, 30)),
@@ -568,44 +643,44 @@ public Object[][] timestampTestCases()
testcase("2082-04-06T22:31:34+03:30", 3542727694000L, zone(3, 30)),
testcase("2035-06-05T05:44:30+07:00", 2064609870000L, zone(7)),
testcase("2067-05-16T16:35:12+12:45", 3072743412000L, zone(12, 45)),
- testcase("2024-10-27T22:59:15Z", 1730069955000L, GMT),
+ testcase("2024-10-27T22:59:15Z", 1730069955000L, UTC),
testcase("2067-08-24T03:44:20-06:00", 3081404660000L, zone(-6)),
testcase("1971-06-13T06:37:28+02:00", 45635848000L, zone(2)),
testcase("2062-06-20T15:41:31+06:00", 2918022091000L, zone(6)),
testcase("2070-10-14T16:27:41+11:00", 3180490061000L, zone(11)),
- testcase("2087-01-10T13:22:50Z", 3693043370000L, GMT),
+ testcase("2087-01-10T13:22:50Z", 3693043370000L, UTC),
testcase("2049-09-11T21:43:34-08:00", 2515038214000L, zone(-8)),
- testcase("2070-12-02T16:39:48Z", 3184763988000L, GMT),
+ testcase("2070-12-02T16:39:48Z", 3184763988000L, UTC),
testcase("2047-10-13T12:32:53+05:30", 2454562973000L, zone(5, 30)),
testcase("1988-10-30T15:44:30+10:00", 594193470000L, zone(10)),
- testcase("1978-07-28T15:34:04Z", 270488044000L, GMT),
+ testcase("1978-07-28T15:34:04Z", 270488044000L, UTC),
testcase("1976-06-22T09:01:39-09:30", 204316299000L, zone(-9, -30)),
testcase("1984-07-31T01:30:36-02:00", 460092636000L, zone(-2)),
testcase("2028-01-14T16:35:09+05:00", 1831462509000L, zone(5)),
testcase("2068-06-23T02:05:34+09:00", 3107610334000L, zone(9)),
- testcase("1984-09-05T06:03:19Z", 463212199000L, GMT),
+ testcase("1984-09-05T06:03:19Z", 463212199000L, UTC),
testcase("2030-11-15T22:49:17-11:00", 1921052957000L, zone(-11)),
testcase("1975-01-13T02:37:13-03:30", 158825233000L, zone(-3, -30)),
testcase("2042-05-05T22:28:40+04:00", 2282927320000L, zone(4)),
testcase("2059-07-10T17:07:51+08:00", 2825053671000L, zone(8)),
testcase("1981-06-02T22:13:01+13:00", 360321181000L, zone(13)),
- testcase("2000-02-20T17:07:40Z", 951066460000L, GMT),
+ testcase("2000-02-20T17:07:40Z", 951066460000L, UTC),
testcase("2050-02-12T09:14:41-05:00", 2528288081000L, zone(-5)),
testcase("1973-08-30T03:47:32-04:00", 115544852000L, zone(-4)),
testcase("1991-04-04T13:17:27+03:00", 670760247000L, zone(3)),
testcase("2078-12-05T22:48:14+07:00", 3437480894000L, zone(7)),
testcase("2014-09-06T07:11:56+12:00", 1409944316000L, zone(12)),
- testcase("2013-02-15T04:28:27Z", 1360902507000L, GMT),
+ testcase("2013-02-15T04:28:27Z", 1360902507000L, UTC),
testcase("1980-02-10T21:01:04-06:00", 319086064000L, zone(-6)),
testcase("2053-12-17T07:28:06+01:00", 2649565686000L, zone(1)),
testcase("1972-09-23T05:41:37+06:00", 86053297000L, zone(6)),
testcase("1988-03-02T18:29:36+11:00", 573290976000L, zone(11)),
- testcase("1997-10-03T03:37:16Z", 875849836000L, GMT),
+ testcase("1997-10-03T03:37:16Z", 875849836000L, UTC),
testcase("1997-06-15T05:17:44-08:00", 866380664000L, zone(-8)),
testcase("2065-12-01T01:40:33-01:00", 3026860833000L, zone(-1)),
testcase("2032-01-15T17:08:42+05:30", 1957779522000L, zone(5, 30)),
testcase("2014-05-08T21:46:08+10:00", 1399549568000L, zone(10)),
- testcase("1971-04-22T10:22:55Z", 41163775000L, GMT),
+ testcase("1971-04-22T10:22:55Z", 41163775000L, UTC),
testcase("2040-07-19T16:07:52-09:30", 2226361072000L, zone(-9, -30)),
testcase("2041-01-10T14:51:26-03:00", 2241453086000L, zone(-3)),
testcase("2058-10-04T18:54:28+04:30", 2800967068000L, zone(4, 30)),
@@ -616,23 +691,23 @@ public Object[][] timestampTestCases()
testcase("1991-02-20T14:34:19+03:30", 667047859000L, zone(3, 30)),
testcase("1970-04-17T04:36:08+08:00", 9146168000L, zone(8)),
testcase("2067-09-13T16:27:44+12:45", 3083110964000L, zone(12, 45)),
- testcase("1985-02-12T12:18:27Z", 477058707000L, GMT),
+ testcase("1985-02-12T12:18:27Z", 477058707000L, UTC),
testcase("2043-09-21T03:34:44-05:00", 2326437284000L, zone(-5)),
testcase("2047-09-24T13:17:48+02:00", 2452936668000L, zone(2)),
testcase("2016-06-15T09:25:12+06:30", 1465959312000L, zone(6, 30)),
testcase("1987-09-19T10:45:47+11:00", 559007147000L, zone(11)),
- testcase("2032-08-10T13:47:19Z", 1975758439000L, GMT),
+ testcase("2032-08-10T13:47:19Z", 1975758439000L, UTC),
testcase("2082-07-24T01:01:08-07:00", 3552105668000L, zone(-7)),
- testcase("2036-12-09T20:35:18Z", 2112467718000L, GMT),
+ testcase("2036-12-09T20:35:18Z", 2112467718000L, UTC),
testcase("2045-11-27T18:03:10+05:45", 2395397890000L, zone(5, 45)),
testcase("2079-05-10T17:17:44+10:00", 3450928664000L, zone(10)),
- testcase("2064-03-31T06:54:59Z", 2974172099000L, GMT),
- testcase("2088-04-19T06:44:49Z", 3733195489000L, GMT),
+ testcase("2064-03-31T06:54:59Z", 2974172099000L, UTC),
+ testcase("2088-04-19T06:44:49Z", 3733195489000L, UTC),
testcase("2085-02-19T01:11:06-09:00", 3633415866000L, zone(-9)),
testcase("2073-08-09T06:16:00.329-01:00", 3269488560329L, zone(-1)),
testcase("1993-04-24T23:37:45+05:30", 735674865000L, zone(5, 30)),
testcase("2039-10-22T14:27:33+09:30", 2202872253000L, zone(9, 30)),
- testcase("1988-03-13T22:07:37Z", 574294057000L, GMT),
+ testcase("1988-03-13T22:07:37Z", 574294057000L, UTC),
testcase("1988-01-19T18:14:23-10:00", 569650463000L, zone(-10)),
testcase("2034-10-22T07:24:58-03:00", 2045125498000L, zone(-3)),
testcase("2064-06-07T23:00:18+04:30", 2980089018000L, zone(4, 30)),
@@ -643,22 +718,22 @@ public Object[][] timestampTestCases()
testcase("2055-10-15T08:27:26+03:30", 2707189046000L, zone(3, 30)),
testcase("2057-06-14T20:37:18+07:00", 2759751438000L, zone(7)),
testcase("2082-10-16T01:10:46+12:45", 3559292746000L, zone(12, 45)),
- testcase("1994-10-04T03:55:17Z", 781242917000L, GMT),
+ testcase("1994-10-04T03:55:17Z", 781242917000L, UTC),
testcase("2050-02-15T15:32:26-06:00", 2528573546000L, zone(-6)),
testcase("2049-12-28T02:18:33+02:00", 2524263513000L, zone(2)),
testcase("1989-03-09T19:16:05+06:00", 605452565000L, zone(6)),
testcase("2049-12-22T16:27:16+11:00", 2523763636000L, zone(11)),
- testcase("2036-02-25T11:39:59Z", 2087552399000L, GMT),
+ testcase("2036-02-25T11:39:59Z", 2087552399000L, UTC),
testcase("1979-06-13T23:51:56-08:00", 298194716000L, zone(-8)),
- testcase("1988-06-19T11:59:29Z", 582724769000L, GMT),
+ testcase("1988-06-19T11:59:29Z", 582724769000L, UTC),
testcase("2044-04-16T06:16:51+05:30", 2344380411000L, zone(5, 30)),
testcase("2028-09-06T11:11:31+10:00", 1851815491000L, zone(10)),
- testcase("2093-11-24T04:16:20Z", 3909874580000L, GMT),
+ testcase("2093-11-24T04:16:20Z", 3909874580000L, UTC),
testcase("2084-12-21T08:43:31-09:30", 3628260811000L, zone(-9, -30)),
testcase("1970-01-15T01:55:59-02:00", 1223759000L, zone(-2)),
testcase("1994-08-17T17:12:32+04:30", 777127352000L, zone(4, 30)),
testcase("2011-07-02T13:41:43+09:00", 1309581703000L, zone(9)),
- testcase("2088-10-12T20:34:55Z", 3748451695000L, GMT),
+ testcase("2088-10-12T20:34:55Z", 3748451695000L, UTC),
testcase("2060-09-10T22:06:22-11:00", 2862119182000L, zone(-11)),
testcase("2006-04-25T10:53:12-03:30", 1145974992000L, zone(-3, -30)),
testcase("2003-10-20T17:12:36+04:00", 1066655556000L, zone(4)),
@@ -670,12 +745,12 @@ public Object[][] timestampTestCases()
testcase("1973-08-30T01:12:45+03:00", 115510365000L, zone(3)),
testcase("2016-10-05T15:12:57+07:00", 1475655177000L, zone(7)),
testcase("1989-02-08T10:18:45+12:00", 602893125000L, zone(12)),
- testcase("2063-07-28T13:18:34Z", 2952854314000L, GMT),
+ testcase("2063-07-28T13:18:34Z", 2952854314000L, UTC),
testcase("1991-02-21T03:28:25-06:00", 667128505000L, zone(-6)),
testcase("2070-05-19T13:16:54+01:00", 3167727414000L, zone(1)),
testcase("2003-05-21T03:23:38+06:00", 1053465818000L, zone(6)),
testcase("2075-03-20T21:56:57+11:00", 3320305017000L, zone(11)),
- testcase("1988-06-04T20:44:24Z", 581460264000L, GMT),
+ testcase("1988-06-04T20:44:24Z", 581460264000L, UTC),
};
}
}