1package org.bouncycastle.asn1.x509; 2 3import java.text.ParsePosition; 4import java.text.SimpleDateFormat; 5import java.util.Date; 6import java.util.SimpleTimeZone; 7 8import org.bouncycastle.asn1.ASN1Choice; 9import org.bouncycastle.asn1.ASN1Encodable; 10import org.bouncycastle.asn1.ASN1TaggedObject; 11import org.bouncycastle.asn1.DERGeneralizedTime; 12import org.bouncycastle.asn1.DERObject; 13import org.bouncycastle.asn1.DERUTCTime; 14 15public class Time 16 extends ASN1Encodable 17 implements ASN1Choice 18{ 19 DERObject time; 20 21 public static Time getInstance( 22 ASN1TaggedObject obj, 23 boolean explicit) 24 { 25 return getInstance(obj.getObject()); // must be explicitly tagged 26 } 27 28 public Time( 29 DERObject time) 30 { 31 if (!(time instanceof DERUTCTime) 32 && !(time instanceof DERGeneralizedTime)) 33 { 34 throw new IllegalArgumentException("unknown object passed to Time"); 35 } 36 37 this.time = time; 38 } 39 40 /** 41 * creates a time object from a given date - if the date is between 1950 42 * and 2049 a UTCTime object is generated, otherwise a GeneralizedTime 43 * is used. 44 */ 45 public Time( 46 Date date) 47 { 48 SimpleTimeZone tz = new SimpleTimeZone(0, "Z"); 49 SimpleDateFormat dateF = new SimpleDateFormat("yyyyMMddHHmmss"); 50 51 dateF.setTimeZone(tz); 52 53 String d = dateF.format(date) + "Z"; 54 int year = Integer.parseInt(d.substring(0, 4)); 55 56 if (year < 1950 || year > 2049) 57 { 58 time = new DERGeneralizedTime(d); 59 } 60 else 61 { 62 time = new DERUTCTime(d.substring(2)); 63 } 64 } 65 66 public static Time getInstance( 67 Object obj) 68 { 69 if (obj instanceof Time) 70 { 71 return (Time)obj; 72 } 73 else if (obj instanceof DERUTCTime) 74 { 75 return new Time((DERUTCTime)obj); 76 } 77 else if (obj instanceof DERGeneralizedTime) 78 { 79 return new Time((DERGeneralizedTime)obj); 80 } 81 82 throw new IllegalArgumentException("unknown object in factory"); 83 } 84 85 public String getTime() 86 { 87 if (time instanceof DERUTCTime) 88 { 89 return ((DERUTCTime)time).getAdjustedTime(); 90 } 91 else 92 { 93 return ((DERGeneralizedTime)time).getTime(); 94 } 95 } 96 97 public Date getDate() 98 { 99 SimpleDateFormat dateF = new SimpleDateFormat("yyyyMMddHHmmssz"); 100 101 return dateF.parse(this.getTime(), new ParsePosition(0)); 102 } 103 104 /** 105 * Produce an object suitable for an ASN1OutputStream. 106 * <pre> 107 * Time ::= CHOICE { 108 * utcTime UTCTime, 109 * generalTime GeneralizedTime } 110 * </pre> 111 */ 112 public DERObject toASN1Object() 113 { 114 return time; 115 } 116} 117