public static MomentInterval parseISO(String text)
        throws ParseException {

        if (text.isEmpty()) {
            throw new IndexOutOfBoundsException("Empty text.");
        }

        // prescan for format analysis
		int start = 0;
		int n = Math.min(text.length(), 117);
        boolean sameFormat = true;
        int firstDate = 1; // loop starts one index position later
        int secondDate = 0;
        int timeLength = 0;
        boolean startsWithHyphen = (text.charAt(0) == '-');

        if ((text.charAt(0) == 'P') || startsWithHyphen) {
            for (int i = 1; i < n; i++) {
                if (text.charAt(i) == '/') {
                    if (i + 1 == n) {
                        throw new ParseException("Missing end component.", n);
                    } else if (startsWithHyphen) {
                        if ((text.charAt(1) == '\u221E') || (i == 1)) {
                            start = i + 1;
                        }
                    } else {
                        start = i + 1;
                    }
                    break;
                }
            }
        }

        int literals = 0;
        int literals2 = 0;
        boolean ordinalStyle = false;
        boolean weekStyle = false;
        boolean weekStyle2 = false;
        boolean secondComponent = false;
        int slash = -1;

        for (int i = start + 1; i < n; i++) {
            char c = text.charAt(i);
            if (secondComponent) {
                if (
                    (c == 'P')
                    || ((c == '-') && (i == n - 1))
                    || ((c == '+') && (i == n - 2) && (text.charAt(i + 1) == '\u221E'))
                ) {
                    secondComponent = false;
                    break;
                } else if ((c == 'T') || (timeLength > 0)) {
                    timeLength++;
                } else {
                    if (c == 'W') {
                        weekStyle2 = true;
                    } else if ((c == '-') && (i > slash + 1)) {
                        literals2++;
                    }
                    secondDate++;
                }
            } else if (c == '/') {
                if (slash == -1) {
                    slash = i;
                    secondComponent = true;
                    timeLength = 0;
                } else {
                    throw new ParseException("Interval with two slashes found: " + text, i);
                }
            } else if ((c == 'T') || (timeLength > 0)) {
                timeLength++;
            } else if (c == '-') {
                firstDate++;
                literals++;
            } else if (c == 'W') {
                firstDate++;
                weekStyle = true;
            } else {
                firstDate++;
            }
        }

        if (secondComponent && (weekStyle != weekStyle2)) {
            throw new ParseException("Mixed date styles not allowed.", n);
        }

        char c = text.charAt(start);
        int componentLength = firstDate - 4;

        if ((c == '+') || (c == '-')) {
            componentLength -= 2;
        }

        if (!weekStyle) {
            ordinalStyle = ((literals == 1) || ((literals == 0) && (componentLength == 3)));
        }

        boolean extended = (literals > 0);
        boolean hasT = true;

        if (secondComponent) {
            if (timeLength == 0) { // no T in end component => no date part
                hasT = false;
                timeLength = secondDate;
                secondDate = 0;
            }
            sameFormat = ((firstDate == secondDate) && (literals == literals2) && hasSecondOffset(text, n));
        }

        // prepare component parsers
        ChronoFormatter<Moment> startFormat = (
            extended ? Iso8601Format.EXTENDED_DATE_TIME_OFFSET : Iso8601Format.BASIC_DATE_TIME_OFFSET);
        ChronoFormatter<Moment> endFormat = (sameFormat ? startFormat : null); // null means reduced iso format

        // create interval
        Parser parser = new Parser(startFormat, endFormat, extended, weekStyle, ordinalStyle, timeLength, hasT);
        return parser.parse(text);

    }
public static MomentInterval parseISO ( String text ) throws ParseException { if ( text . isEmpty ( ) ) { throw new IndexOutOfBoundsException ( "Empty text." ) ; } int start = 0 ; int n = Math . min ( text . length ( ) , 117 ) ; boolean sameFormat = true ; int firstDate = 1 ; int secondDate = 0 ; int timeLength = 0 ; boolean startsWithHyphen = ( text . charAt ( 0 ) == '-' ) ; if ( ( text . charAt ( 0 ) == 'P' ) || startsWithHyphen ) { for ( int i = 1 ; i < n ; i ++ ) { if ( text . charAt ( i ) == '/' ) { if ( i + 1 == n ) { throw new ParseException ( "Missing end component." , n ) ; } else if ( startsWithHyphen ) { if ( ( text . charAt ( 1 ) == '∞' ) || ( i == 1 ) ) { start = i + 1 ; } } else { start = i + 1 ; } break ; } } } int literals = 0 ; int literals2 = 0 ; boolean ordinalStyle = false ; boolean weekStyle = false ; boolean weekStyle2 = false ; boolean secondComponent = false ; int slash = - 1 ; for ( int i = start + 1 ; i < n ; i ++ ) { char c = text . charAt ( i ) ; if ( secondComponent ) { if ( ( c == 'P' ) || ( ( c == '-' ) && ( i == n - 1 ) ) || ( ( c == '+' ) && ( i == n - 2 ) && ( text . charAt ( i + 1 ) == '∞' ) ) ) { secondComponent = false ; break ; } else if ( ( c == 'T' ) || ( timeLength > 0 ) ) { timeLength ++ ; } else { if ( c == 'W' ) { weekStyle2 = true ; } else if ( ( c == '-' ) && ( i > slash + 1 ) ) { literals2 ++ ; } secondDate ++ ; } } else if ( c == '/' ) { if ( slash == - 1 ) { slash = i ; secondComponent = true ; timeLength = 0 ; } else { throw new ParseException ( "Interval with two slashes found: " + text , i ) ; } } else if ( ( c == 'T' ) || ( timeLength > 0 ) ) { timeLength ++ ; } else if ( c == '-' ) { firstDate ++ ; literals ++ ; } else if ( c == 'W' ) { firstDate ++ ; weekStyle = true ; } else { firstDate ++ ; } } if ( secondComponent && ( weekStyle != weekStyle2 ) ) { throw new ParseException ( "Mixed date styles not allowed." , n ) ; } char c = text . charAt ( start ) ; int componentLength = firstDate - 4 ; if ( ( c == '+' ) || ( c == '-' ) ) { componentLength -= 2 ; } if ( ! weekStyle ) { ordinalStyle = ( ( literals == 1 ) || ( ( literals == 0 ) && ( componentLength == 3 ) ) ) ; } boolean extended = ( literals > 0 ) ; boolean hasT = true ; if ( secondComponent ) { if ( timeLength == 0 ) { hasT = false ; timeLength = secondDate ; secondDate = 0 ; } sameFormat = ( ( firstDate == secondDate ) && ( literals == literals2 ) && hasSecondOffset ( text , n ) ) ; } ChronoFormatter < Moment > startFormat = ( extended ? Iso8601Format . EXTENDED_DATE_TIME_OFFSET : Iso8601Format . BASIC_DATE_TIME_OFFSET ) ; ChronoFormatter < Moment > endFormat = ( sameFormat ? startFormat : null ) ; Parser parser = new Parser ( startFormat , endFormat , extended , weekStyle , ordinalStyle , timeLength , hasT ) ; return parser . parse ( text ) ; }
/*[deutsch]
<p>Interpretiert den angegebenen ISO-konformen Text als Intervall. </p>

<p>Alle Stile werden unterst&uuml;tzt, n&auml;mlich Kalendardatum,
Ordinaldatum und Wochendatum, sowohl im Basisformat als auch im
erweiterten Format. Gemischte Datumsstile von Start und Ende
sind jedoch nicht erlaubt. Au&szlig;erdem darf eine der beiden
Komponenten Start und Ende als P-String vorliegen. Wenn nicht, dann
darf die Endkomponente auch in einer abgek&uuml;rzten Schreibweise
angegeben werden, in der weniger pr&auml;zise Elemente wie das
Kalenderjahr ausgelassen und von der Startkomponente &uuml;bernommen
werden. In letzterem Fall ist auch der Offset der Endkomponente
optional. Unendlichkeitssymbole werden verstanden, obwohl ISO-8601
keine unendlichen Intervalle kennt. Beispiele f&uuml;r unterst&uuml;tzte
Formate: </p>

<pre>
System.out.println(
MomentInterval.parseISO(
&quot;2012-01-01T14:15Z/2014-06-20T16:00Z&quot;));
// Ausgabe: [2012-01-01T14:15:00Z/2014-06-20T16:00:00Z)

System.out.println(
MomentInterval.parseISO(
&quot;2012-01-01T14:15Z/08-11T16:00+00:01&quot;));
// Ausgabe: [2012-01-01T14:15:00Z/2012-08-11T15:59:00Z)

System.out.println(
MomentInterval.parseISO(
&quot;2012-01-01T14:15Z/16:00&quot;));
// Ausgabe: [2012-01-01T14:15:00Z/2012-01-01T16:00:00Z)

System.out.println(
MomentInterval.parseISO(
&quot;2012-01-01T14:15Z/P2DT1H45M&quot;));
// Ausgabe: [2012-01-01T14:15:00Z/2012-01-03T16:00:00Z)

System.out.println(
MomentInterval.parseISO(
&quot;2015-01-01T08:45Z/-&quot;));
// Ausgabe: [2015-01-01T08:45:00Z/+&#x221E;)
</pre>

<p>Intern wird das notwendige Intervallformat f&uuml;r reduzierte Formen dynamisch ermittelt. Ist
das Antwortzeitverhalten wichtiger, sollte einem statisch initialisierten konstanten Format der
Vorzug gegeben werden. </p>

@param   text        text to be parsed
@return  parsed interval
@throws  IndexOutOfBoundsException if given text is empty
@throws  ParseException if the text is not parseable
@since   2.0
@see     BracketPolicy#SHOW_NEVER