diff --git a/pom.xml b/pom.xml
index e303359bc..21a27e594 100644
--- a/pom.xml
+++ b/pom.xml
@@ -76,7 +76,7 @@
UTF-8
- 1.6
+ 1.8
@@ -86,8 +86,8 @@
3.3
1.6.5
2.4
- 1.14
- 1.1
+ 1.15
+ 1.0
3.4
2.8
@@ -99,7 +99,6 @@
4.4.1
4.4.1
1.2
- 2.8
3.4
2.4
@@ -243,12 +242,6 @@
${commons-lang3.version}
-
- joda-time
- joda-time
- ${joda-time.version}
-
-
junit
junit
@@ -355,13 +348,13 @@
org.codehaus.mojo.signature
- java16-sun
+ java18
${animal-sniffer-maven-plugin.signature.version}
- check-java16-sun
+ check-java18
test
check
diff --git a/src/main/java/microsoft/exchange/webservices/data/core/EwsUtilities.java b/src/main/java/microsoft/exchange/webservices/data/core/EwsUtilities.java
index c822d9bf1..813c8fcc4 100644
--- a/src/main/java/microsoft/exchange/webservices/data/core/EwsUtilities.java
+++ b/src/main/java/microsoft/exchange/webservices/data/core/EwsUtilities.java
@@ -53,8 +53,6 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.joda.time.Period;
-import org.joda.time.format.ISOPeriodFormat;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
@@ -70,6 +68,7 @@
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
+import java.time.Duration;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
@@ -883,9 +882,9 @@ public static TimeSpan getXSDurationToTimeSpan(String xsDuration) {
xsDuration = xsDuration.replace("-P", "P");
}
- Period period = Period.parse(xsDuration, ISOPeriodFormat.standard());
-
- long retval = period.toStandardDuration().getMillis();
+ Duration period = Duration.parse(xsDuration);
+
+ long retval = period.toMillis();
if (negative) {
retval = -retval;
diff --git a/src/main/java/microsoft/exchange/webservices/data/util/DateTimeUtils.java b/src/main/java/microsoft/exchange/webservices/data/util/DateTimeUtils.java
index 0a30a3f02..69204cbfd 100644
--- a/src/main/java/microsoft/exchange/webservices/data/util/DateTimeUtils.java
+++ b/src/main/java/microsoft/exchange/webservices/data/util/DateTimeUtils.java
@@ -24,11 +24,20 @@
package microsoft.exchange.webservices.data.util;
import org.apache.commons.lang3.StringUtils;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.OffsetTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.time.temporal.ChronoField;
+import java.time.temporal.TemporalAccessor;
import java.util.Date;
+import static java.time.temporal.ChronoField.INSTANT_SECONDS;
+
public final class DateTimeUtils {
private static final DateTimeFormatter[] DATE_TIME_FORMATS = createDateTimeFormats();
@@ -84,8 +93,29 @@ private static Date parseInternal(String value, boolean dateOnly) {
final DateTimeFormatter[] formats = dateOnly ? DATE_FORMATS : DATE_TIME_FORMATS;
for (final DateTimeFormatter format : formats) {
try {
- return format.parseDateTime(value).toDate();
- } catch (IllegalArgumentException e) {
+ TemporalAccessor temporalAccessor = format.parse(value);
+
+ Instant instant = null;
+
+ if (!temporalAccessor.isSupported(INSTANT_SECONDS)) {
+ // Only date
+ ZoneOffset zoneOffset = ZoneOffset.UTC;
+
+ if (temporalAccessor.isSupported(ChronoField.OFFSET_SECONDS)) {
+ // Have date with timezone offset
+ zoneOffset = ZoneOffset.ofTotalSeconds(temporalAccessor.get(ChronoField.OFFSET_SECONDS));
+ }
+
+ instant = LocalDate.from(temporalAccessor).atTime(OffsetTime.of(LocalTime.MIDNIGHT, zoneOffset)).toInstant();
+
+ } else {
+ // Date and time
+ instant = Instant.from(temporalAccessor);
+ }
+
+ return Date.from(instant);
+
+ } catch (DateTimeParseException e) {
// Ignore and try the next pattern.
}
}
@@ -97,21 +127,26 @@ private static Date parseInternal(String value, boolean dateOnly) {
private static DateTimeFormatter[] createDateTimeFormats() {
return new DateTimeFormatter[] {
- DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ").withZoneUTC(),
- DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ").withZoneUTC(),
- DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ").withZoneUTC(),
- DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss").withZoneUTC(),
- DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS").withZoneUTC(),
- DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSS").withZoneUTC(),
- DateTimeFormat.forPattern("yyyy-MM-ddZ").withZoneUTC(),
- DateTimeFormat.forPattern("yyyy-MM-dd").withZoneUTC()
+ DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZZZZZ"),
+ DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"),
+ DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"),
+ DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"),
+ DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZZZZZ"),
+ DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ"),
+ DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss").withZone(ZoneOffset.UTC),
+ DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS").withZone(ZoneOffset.UTC),
+ DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSS").withZone(ZoneOffset.UTC),
+ DateTimeFormatter.ofPattern("yyyy-MM-ddZZZZZ"),
+ DateTimeFormatter.ofPattern("yyyy-MM-ddZ"),
+ DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneOffset.UTC)
};
}
private static DateTimeFormatter[] createDateFormats() {
return new DateTimeFormatter[] {
- DateTimeFormat.forPattern("yyyy-MM-ddZ").withZoneUTC(),
- DateTimeFormat.forPattern("yyyy-MM-dd").withZoneUTC()
+ DateTimeFormatter.ofPattern("yyyy-MM-ddZZZZZ"),
+ DateTimeFormatter.ofPattern("yyyy-MM-ddZ"),
+ DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneOffset.UTC)
};
}
diff --git a/src/test/java/microsoft/exchange/webservices/data/core/XSDurationTest.java b/src/test/java/microsoft/exchange/webservices/data/core/XSDurationTest.java
index f18445d6f..f962527fc 100644
--- a/src/test/java/microsoft/exchange/webservices/data/core/XSDurationTest.java
+++ b/src/test/java/microsoft/exchange/webservices/data/core/XSDurationTest.java
@@ -19,14 +19,14 @@
package microsoft.exchange.webservices.data.core;
-import microsoft.exchange.webservices.data.core.EwsUtilities;
import microsoft.exchange.webservices.data.misc.TimeSpan;
-
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
+import java.time.format.DateTimeParseException;
+
@RunWith(JUnit4.class)
public class XSDurationTest {
@@ -62,7 +62,7 @@ public void testPeriodFail2() {
Assert.assertEquals("P0DT3H40M59.0S", EwsUtilities.getTimeSpanToXSDuration(timeSpan));
}
- @Test(expected = IllegalArgumentException.class)
+ @Test(expected = DateTimeParseException.class)
public void testPeriodFail() {
TimeSpan timeSpan = EwsUtilities.getXSDurationToTimeSpan("P2H30M59.0S");
Assert.assertEquals("-P0DT2H30M59.0S", EwsUtilities.getTimeSpanToXSDuration(timeSpan));