public String toGeneralizedTime()

in util/src/main/java/org/apache/directory/api/util/GeneralizedTime.java [783:1021]


    public String toGeneralizedTime( Format format, FractionDelimiter fractionDelimiter, int fractionLength,
        TimeZoneFormat timeZoneFormat )
    {
        Calendar clonedCalendar = ( Calendar ) calendar.clone();

        if ( timeZoneFormat == TimeZoneFormat.Z )
        {
            clonedCalendar.setTimeZone( GMT );
        }

        // Create the result. It can contain a maximum of 23 chars
        byte[] result = new byte[23];

        // The starting point
        int pos = 0;

        // Inject the year
        int year = clonedCalendar.get( Calendar.YEAR );

        result[pos++] = ( byte ) ( ( year / 1000 ) + '0' );
        year %= 1000;

        result[pos++] = ( byte ) ( ( year / 100 ) + '0' );
        year %= 100;

        result[pos++] = ( byte ) ( ( year / 10 ) + '0' );

        result[pos++] = ( byte ) ( ( year % 10 ) + '0' );

        // Inject the month
        int month = clonedCalendar.get( Calendar.MONTH ) + 1;

        result[pos++] = ( byte ) ( ( month / 10 ) + '0' );

        result[pos++] = ( byte ) ( ( month % 10 ) + '0' );

        // Inject the day
        int day = clonedCalendar.get( Calendar.DAY_OF_MONTH );

        result[pos++] = ( byte ) ( ( day / 10 ) + '0' );

        result[pos++] = ( byte ) ( ( day % 10 ) + '0' );

        // Inject the hour
        int hour = clonedCalendar.get( Calendar.HOUR_OF_DAY );

        result[pos++] = ( byte ) ( ( hour / 10 ) + '0' );

        result[pos++] = ( byte ) ( ( hour % 10 ) + '0' );

        switch ( format )
        {
            case YEAR_MONTH_DAY_HOUR_MIN_SEC:
                // Inject the minutes
                int minute = clonedCalendar.get( Calendar.MINUTE );

                result[pos++] = ( byte ) ( ( minute / 10 ) + '0' );

                result[pos++] = ( byte ) ( ( minute % 10 ) + '0' );

                // Inject the seconds
                int second = clonedCalendar.get( Calendar.SECOND );

                result[pos++] = ( byte ) ( ( second / 10 ) + '0' );

                result[pos++] = ( byte ) ( ( second % 10 ) + '0' );

                break;

            case YEAR_MONTH_DAY_HOUR_MIN_SEC_FRACTION:
                // Inject the minutes
                minute = clonedCalendar.get( Calendar.MINUTE );

                result[pos++] = ( byte ) ( ( minute / 10 ) + '0' );

                result[pos++] = ( byte ) ( ( minute % 10 ) + '0' );

                // Inject the seconds
                second = clonedCalendar.get( Calendar.SECOND );

                result[pos++] = ( byte ) ( ( second / 10 ) + '0' );

                result[pos++] = ( byte ) ( ( second % 10 ) + '0' );

                // Inject the fraction
                if ( fractionDelimiter == FractionDelimiter.COMMA )
                {
                    result[pos++] = ',';
                }
                else
                {
                    result[pos++] = '.';
                }

                // Inject the fraction
                int millisecond = clonedCalendar.get( Calendar.MILLISECOND );

                result[pos++] = ( byte ) ( ( millisecond / 100 ) + '0' );
                millisecond %= 100;

                result[pos++] = ( byte ) ( ( millisecond / 10 ) + '0' );

                //if ( millisecond > 0 )
                result[pos++] = ( byte ) ( ( millisecond % 10 ) + '0' );

                break;

            case YEAR_MONTH_DAY_HOUR_MIN:
                // Inject the minutes
                minute = clonedCalendar.get( Calendar.MINUTE );

                result[pos++] = ( byte ) ( ( minute / 10 ) + '0' );

                result[pos++] = ( byte ) ( ( minute % 10 ) + '0' );
                break;

            case YEAR_MONTH_DAY_HOUR_MIN_FRACTION:
                // Inject the minutes
                minute = clonedCalendar.get( Calendar.MINUTE );

                result[pos++] = ( byte ) ( ( minute / 10 ) + '0' );

                result[pos++] = ( byte ) ( ( minute % 10 ) + '0' );

                // sec + millis => fraction of a minute
                int fraction = 1000 * clonedCalendar.get( Calendar.SECOND )
                    + clonedCalendar.get( Calendar.MILLISECOND );
                fraction /= 60;

                if ( fraction > 0 )
                {
                    if ( fractionDelimiter == FractionDelimiter.COMMA )
                    {
                        result[pos++] = ',';
                    }
                    else
                    {
                        result[pos++] = '.';
                    }

                    // At this point, the fraction should be in [999, 1]
                    result[pos++] = ( byte ) ( ( fraction / 100 ) + '0' );
                    fraction %= 100;

                    if ( fraction > 0 )
                    {
                        result[pos++] = ( byte ) ( ( fraction / 10 ) + '0' );

                        if ( fraction > 0 )
                        {
                            result[pos++] = ( byte ) ( ( fraction % 10 ) + '0' );
                        }
                    }
                }

                break;

            case YEAR_MONTH_DAY_HOUR:
                // nothing to add
                break;

            case YEAR_MONTH_DAY_HOUR_FRACTION:
                // min + sec + millis => fraction of an hour
                fraction = 1000 * 60 * clonedCalendar.get( Calendar.MINUTE ) + 1000
                    * clonedCalendar.get( Calendar.SECOND )
                    + clonedCalendar.get( Calendar.MILLISECOND );
                fraction /= 60 * 60;

                // At this point, the fraction should be in [999, 1]
                if ( fraction > 0 )
                {
                    if ( fractionDelimiter == FractionDelimiter.COMMA )
                    {
                        result[pos++] = ',';
                    }
                    else
                    {
                        result[pos++] = '.';
                    }

                    result[pos++] = ( byte ) ( ( fraction / 100 ) + '0' );
                    fraction %= 100;

                    if ( fraction > 0 )
                    {
                        result[pos++] = ( byte ) ( ( fraction / 10 ) + '0' );

                        if ( fraction > 0 )
                        {
                            result[pos++] = ( byte ) ( ( fraction % 10 ) + '0' );
                        }
                    }
                }

                break;

            default:
                throw new IllegalArgumentException( I18n.err( I18n.ERR_17069_UNEXPECTED_FORMAT, format ) );
        }

        if ( ( timeZoneFormat == TimeZoneFormat.Z ) && clonedCalendar.getTimeZone().hasSameRules( GMT ) )
        {
            result[pos++] = 'Z';
        }
        else
        {
            // g-differential
            int offset = clonedCalendar.get( Calendar.ZONE_OFFSET ) + clonedCalendar.get( Calendar.DST_OFFSET );
            
            
            if ( offset < 0 )
            {
                result[pos++] = '-';
            }
            else
            {
                result[pos++] = '+';
            }

            offset = Math.abs( offset );
            hour = offset / ( 60 * 60 * 1000 );
            int minute = ( offset - ( hour * 60 * 60 * 1000 ) ) / ( 1000 * 60 );

            // The offset hour
            result[pos++] = ( byte ) ( ( hour / 10 ) + '0' );

            result[pos++] = ( byte ) ( ( hour % 10 ) + '0' );

            if ( ( timeZoneFormat == TimeZoneFormat.DIFF_HOUR_MINUTE ) || ( timeZoneFormat == TimeZoneFormat.Z ) )
            {
                // The offset minute
                result[pos++] = ( byte ) ( ( minute / 10 ) + '0' );

                result[pos++] = ( byte ) ( ( minute % 10 ) + '0' );
            }
        }

        return Strings.utf8ToString( result, 0, pos );
    }