public static Date decodeGeneralizedTime(ByteBuffer buf) {
        // GeneralizedTime ::= [UNIVERSAL 24] IMPLICIT VisibleString
        DerId id = DerId.decode(buf);
        if (!id.matches(DerId.TagClass.UNIVERSAL, DerId.EncodingType.PRIMITIVE, ASN1_GENERALIZED_TIME_TAG_NUM)) {
            throw new IllegalArgumentException("Expected GeneralizedTime identifier, received " + id);
        }
        int len = DerUtils.decodeLength(buf);
        if (buf.remaining() < len) {
            throw new IllegalArgumentException("Insufficient content for GeneralizedTime");
        }

        Date date;

        byte[] dst = new byte[len];
        buf.get(dst);
        String iso8601DateString = new String(dst);
        Matcher matcher = GENERALIZED_TIME_PATTERN.matcher(iso8601DateString);
        if (matcher.matches()) {
            Calendar cal = Calendar.getInstance();
            cal.clear();

            // Process yyyyMMddHHmmss
            cal.set(Calendar.YEAR, Integer.parseInt(matcher.group(1)));
            cal.set(Calendar.MONTH, Integer.parseInt(matcher.group(2)) - 1); // Calendar.MONTH is zero based
            cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(matcher.group(3)));
            cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(matcher.group(4)));
            cal.set(Calendar.MINUTE, Integer.parseInt(matcher.group(5)));
            cal.set(Calendar.SECOND, Integer.parseInt(matcher.group(6)));

            // Process fractional seconds, if any
            String fracSecStr = matcher.group(7);
            if (fracSecStr != null) {
                cal.set(Calendar.MILLISECOND, (int) (Float.parseFloat(fracSecStr) * 1000));
            }

            // Process time zone, if any
            String tzStr = matcher.group(8);
            if (tzStr != null) {
                cal.setTimeZone(TimeZone.getTimeZone("Z".equals(tzStr) ? "GMT" : "GMT" + tzStr));
            }

            date = cal.getTime();
        } else {
            throw new IllegalArgumentException("Malformed GeneralizedTime " + iso8601DateString);
        }
        return date;
    }
public static Date decodeGeneralizedTime ( ByteBuffer buf ) { DerId id = DerId . decode ( buf ) ; if ( ! id . matches ( DerId . TagClass . UNIVERSAL , DerId . EncodingType . PRIMITIVE , ASN1_GENERALIZED_TIME_TAG_NUM ) ) { throw new IllegalArgumentException ( "Expected GeneralizedTime identifier, received " + id ) ; } int len = DerUtils . decodeLength ( buf ) ; if ( buf . remaining ( ) < len ) { throw new IllegalArgumentException ( "Insufficient content for GeneralizedTime" ) ; } Date date ; byte [ ] dst = new byte [ len ] ; buf . get ( dst ) ; String iso8601DateString = new String ( dst ) ; Matcher matcher = GENERALIZED_TIME_PATTERN . matcher ( iso8601DateString ) ; if ( matcher . matches ( ) ) { Calendar cal = Calendar . getInstance ( ) ; cal . clear ( ) ; cal . set ( Calendar . YEAR , Integer . parseInt ( matcher . group ( 1 ) ) ) ; cal . set ( Calendar . MONTH , Integer . parseInt ( matcher . group ( 2 ) ) - 1 ) ; cal . set ( Calendar . DAY_OF_MONTH , Integer . parseInt ( matcher . group ( 3 ) ) ) ; cal . set ( Calendar . HOUR_OF_DAY , Integer . parseInt ( matcher . group ( 4 ) ) ) ; cal . set ( Calendar . MINUTE , Integer . parseInt ( matcher . group ( 5 ) ) ) ; cal . set ( Calendar . SECOND , Integer . parseInt ( matcher . group ( 6 ) ) ) ; String fracSecStr = matcher . group ( 7 ) ; if ( fracSecStr != null ) { cal . set ( Calendar . MILLISECOND , ( int ) ( Float . parseFloat ( fracSecStr ) * 1000 ) ) ; } String tzStr = matcher . group ( 8 ) ; if ( tzStr != null ) { cal . setTimeZone ( TimeZone . getTimeZone ( "Z" . equals ( tzStr ) ? "GMT" : "GMT" + tzStr ) ) ; } date = cal . getTime ( ) ; } else { throw new IllegalArgumentException ( "Malformed GeneralizedTime " + iso8601DateString ) ; } return date ; }
Decode an ASN.1 GeneralizedTime.

@param buf
the DER-encoded GeneralizedTime
@return the data and time