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