FastDateFormatpublic 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. |
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.StringBuffer | format(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 void | main(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.Date | parse(java.lang.String text, java.text.ParsePosition pos)
return df.parse(text, pos);
|
|