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 );
}