diff --git a/src/main/java/net/fortuna/ical4j/model/TemporalAmountAdapter.java b/src/main/java/net/fortuna/ical4j/model/TemporalAmountAdapter.java index d584d3b5e..17fb0dc17 100644 --- a/src/main/java/net/fortuna/ical4j/model/TemporalAmountAdapter.java +++ b/src/main/java/net/fortuna/ical4j/model/TemporalAmountAdapter.java @@ -1,5 +1,6 @@ package net.fortuna.ical4j.model; +import net.fortuna.ical4j.util.CompatibilityHints; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; @@ -115,7 +116,10 @@ private String durationToString(Duration duration) { public static TemporalAmountAdapter parse(String value) { TemporalAmount retVal = null; - if (value.matches("([+-])?P.*(W|D)")) { + if ("P".equals(value) && CompatibilityHints.isHintEnabled(CompatibilityHints.KEY_RELAXED_PARSING)) { + retVal = Period.ZERO; + } + else if (value.matches("([+-])?P.*(W|D)")) { retVal = java.time.Period.parse(value); } else { retVal = java.time.Duration.parse(value); diff --git a/src/test/groovy/net/fortuna/ical4j/model/TemporalAmountAdapterTest.groovy b/src/test/groovy/net/fortuna/ical4j/model/TemporalAmountAdapterTest.groovy index 1d48670a9..7aaa65813 100644 --- a/src/test/groovy/net/fortuna/ical4j/model/TemporalAmountAdapterTest.groovy +++ b/src/test/groovy/net/fortuna/ical4j/model/TemporalAmountAdapterTest.groovy @@ -1,5 +1,6 @@ package net.fortuna.ical4j.model +import net.fortuna.ical4j.util.CompatibilityHints import spock.lang.Specification import spock.lang.Unroll @@ -26,6 +27,18 @@ class TemporalAmountAdapterTest extends Specification { Duration.ofDays(15).plusHours(5).plusSeconds(20) | 'P15DT5H0M20S' } + def "verify relaxed string parsing"() { + setup: 'enable relaxed parsing' + CompatibilityHints.setHintEnabled(CompatibilityHints.KEY_RELAXED_PARSING, true) + + expect: + TemporalAmountAdapter.parse(stringValue).duration == expectedDuration + + where: + stringValue | expectedDuration + "P" | java.time.Period.ZERO + } + def 'verify temporalamount creation'() { expect: TemporalAmountAdapter.from(duration).duration == expectedTemporalAmount