@Override
    public final double days(final GregorianCalendar from, final GregorianCalendar to) {
        if (0 < from.compareTo(to))
            return -this.days(to, from);

        final GregorianCalendar f = this._Adjust(from);
        final GregorianCalendar t = this._Adjust(to);

        double difference = Time.Gregorian.belowDateDifference(from, to);
        difference += t.get(GregorianCalendar.DATE) - f.get(GregorianCalendar.DATE);

        final int fromMonth = f.get(GregorianCalendar.MONTH);
        final int fromYear = f.get(GregorianCalendar.YEAR);
        final int toMonth = t.get(GregorianCalendar.MONTH);
        final int toYear = t.get(GregorianCalendar.YEAR);

        for (int month = 0; month < 12; month++)
        {
            if (month < fromMonth)
                difference -= this.month(fromYear, month);
            if (month < toMonth)
                difference += this.month(toYear, month);
        }
        for (int year = fromYear; year < toYear; year++)
            difference += this.year(year);
        return difference;
    }