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 ; }
Decode an ASN . 1 GeneralizedTime .