FileDocCategorySizeDatePackage
FastDateFormat.javaAPI DocGlassfish v2 API5759Fri May 04 22:32:58 BST 2007org.apache.jasper.util

FastDateFormat

public class FastDateFormat extends DateFormat
Fast date formatter that caches recently formatted date information and uses it to avoid too-frequent calls to the underlying formatter. Note: breaks fieldPosition param of format(Date, StringBuffer, FieldPosition). If you care about the field position, call the underlying DateFormat directly.
author
Stan Bailes
author
Alex Chaffee

Fields Summary
private DateFormat
df
private long
lastSec
private StringBuffer
sb
private FieldPosition
fp
Constructors Summary
public FastDateFormat(DateFormat df)

    
       
        this.df = df;
    
Methods Summary
public java.lang.StringBufferformat(java.util.Date date, java.lang.StringBuffer toAppendTo, java.text.FieldPosition fieldPosition)
Note: breaks functionality of fieldPosition param. Also: there's a bug in SimpleDateFormat with "S" and "SS", use "SSS" instead if you want a msec field.

        long dt = date.getTime();
        long ds = dt / 1000;
        if (ds != lastSec) {
            sb.setLength(0);
            df.format(date, sb, fp);
            lastSec = ds;
        } else {
	    // munge current msec into existing string
            int ms = (int)(dt % 1000);
            int pos = fp.getEndIndex();
	    int begin = fp.getBeginIndex();
	    if (pos > 0) {
		if (pos > begin)
		    sb.setCharAt(--pos, Character.forDigit(ms % 10, 10));
		ms /= 10;
		if (pos > begin)
		    sb.setCharAt(--pos, Character.forDigit(ms % 10, 10));
		ms /= 10;
		if (pos > begin)
		    sb.setCharAt(--pos, Character.forDigit(ms % 10, 10));
	    }
        }
	toAppendTo.append(sb.toString());
	return toAppendTo;
    
public static voidmain(java.lang.String[] args)

	String format = "yyyy-MM-dd HH:mm:ss.SSS";
	if (args.length > 0)
	    format = args[0];
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        FastDateFormat fdf = new FastDateFormat(sdf);
        Date d = new Date();

	d.setTime(1);
	System.out.println(fdf.format(d) + "\t" + sdf.format(d));
	d.setTime(20);
	System.out.println(fdf.format(d) + "\t" + sdf.format(d));
	d.setTime(500);
	System.out.println(fdf.format(d) + "\t" + sdf.format(d));
	d.setTime(543);
	System.out.println(fdf.format(d) + "\t" + sdf.format(d));
	d.setTime(999);
	System.out.println(fdf.format(d) + "\t" + sdf.format(d));
	d.setTime(1050);
	System.out.println(fdf.format(d) + "\t" + sdf.format(d));
	d.setTime(2543);
	System.out.println(fdf.format(d) + "\t" + sdf.format(d));
	d.setTime(12345);
	System.out.println(fdf.format(d) + "\t" + sdf.format(d));
	d.setTime(12340);
	System.out.println(fdf.format(d) + "\t" + sdf.format(d));
	
        final int reps = 100000;
        {
            long start = System.currentTimeMillis();
            for (int i = 0; i < reps; i++) {
                d.setTime(System.currentTimeMillis());
                fdf.format(d);
            }
            long elap = System.currentTimeMillis() - start;
            System.out.println("fast: " + elap + " elapsed");
	    System.out.println(fdf.format(d));
        }
        {
            long start = System.currentTimeMillis();
            for (int i = 0; i < reps; i++) {
                d.setTime(System.currentTimeMillis());
                sdf.format(d);
            }
            long elap = System.currentTimeMillis() - start;	    
            System.out.println("slow: " + elap + " elapsed");
	    System.out.println(sdf.format(d));
        }
    
public java.util.Dateparse(java.lang.String text, java.text.ParsePosition pos)

	return df.parse(text, pos);