public DateTimeParseResult parseResult() throws DateTimeParserException {
        List<DateTimeTokenizer.Token> tokens = tokenize();
        DateTimeParserContext ctx = new DateTimeParserContext(tokens, new DateTimeParserContext.Cursor(), tokenizer, baseDateTime);

        parseNormal(ctx);

        // saving cursor value before apply relative statements
        int snapshot = ctx.cursor().value();

        // the normal process is over its time to apply all relative nodes
        relatives.forEach(relNode -> relNode.apply(ctx));

        if (!ctx.hasModifications()) {
            throw dateTimeParserException(snapshot);
        }

        // restoring cursor
        if (ctx.withCursorValue(snapshot).hasMoreTokens()) {
            throw dateTimeParserException(snapshot);
        }

        return ctx.result();
    }
The base time for relative statements.
exts/jphp-zend-ext/src/main/java/org/develnext/jphp/zend/ext/standard/date/DateTimeParser.java