javajava-timedurationiso8601

Not able to parse P10YT10M ISO-8601 duration string in java


I am trying to parse durationString= P10YT10M using java.time.Duration.parse() method but its failing with "Text cannot be parsed to a Duration "

try {
    String durationString = "P5YT30M";
    Duration duration = Duration.parse(durationString);
} catch ( Exception e) {
    System.err.println( e.getMessage());

Its working for durationStrings like PT5M, but not able to parse durationStrings Similar to P5YT30M, P5Y8M4W3D


Solution

  • java.time.Duration.parse() does not support ISO-8601 duration strings that include years (Y) or months (M).

    This is because Duration only supports time-based durations, not calendar-based durations. There is ambiguity in calendar-based durations e.g. years or months have different lengths, so it is not precise to use them for durations.

    According to the docs, parse method:

    Obtains a Duration from a text string such as PnDTnHnMn.nS.

    If you want to parse something like "P5Y8M4W3D", you should use java.time.Period. Period represents years, months, days - calendar-based units.