[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
java.text.SimpleDateFormat
From: |
Guilhem Lavaux |
Subject: |
java.text.SimpleDateFormat |
Date: |
Sun, 11 Apr 2004 09:14:37 +0200 |
User-agent: |
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030630 |
Hi,
Here is patch to implement attributes in SimpleDateFormat.
ChangeLog entry:
2004-11-04 Guilhem Lavaux <address@hidden>
* java/text/SimpleDateFormat.java:
(formatWithAttribute): New method. It implements
the formatting process with attributes.
(format): Use formatWithAttribute.
(formatToCharacterIterator): New method. Use
formatWithAttribute.
Cheers,
Guilhem.
Index: java/text/SimpleDateFormat.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/text/SimpleDateFormat.java,v
retrieving revision 1.25
diff -u -b -B -r1.25 SimpleDateFormat.java
--- java/text/SimpleDateFormat.java 28 Nov 2003 23:33:06 -0000 1.25
+++ java/text/SimpleDateFormat.java 10 Apr 2004 17:07:21 -0000
@@ -39,16 +39,21 @@
package java.text;
+import gnu.java.text.AttributedFormatBuffer;
+import gnu.java.text.FormatBuffer;
+import gnu.java.text.FormatCharacterIterator;
+import gnu.java.text.StringFormatBuffer;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.Locale;
-import java.util.TimeZone;
import java.util.SimpleTimeZone;
-import java.io.ObjectInputStream;
-import java.io.IOException;
+import java.util.TimeZone;
/**
* SimpleDateFormat provides convenient methods for parsing and formatting
@@ -411,109 +416,164 @@
* appending to the specified StringBuffer. The input StringBuffer
* is returned as output for convenience.
*/
- public StringBuffer format(Date date, StringBuffer buffer, FieldPosition pos)
+ final private void formatWithAttribute(Date date, FormatBuffer buffer,
FieldPosition pos)
{
String temp;
+ AttributedCharacterIterator.Attribute attribute;
calendar.setTime(date);
- // go through ArrayList, filling in fields where applicable, else toString
- Iterator i = tokens.iterator();
- while (i.hasNext()) {
- Object o = i.next();
- if (o instanceof FieldSizePair) {
+ // go through vector, filling in fields where applicable, else toString
+ Iterator iter = tokens.iterator();
+ while (iter.hasNext())
+ {
+ Object o = iter.next();
+ if (o instanceof FieldSizePair)
+ {
FieldSizePair p = (FieldSizePair) o;
int beginIndex = buffer.length();
- switch (p.field) {
+
+ switch (p.field)
+ {
case ERA_FIELD:
- buffer.append(formatData.eras[calendar.get(Calendar.ERA)]);
+ buffer.append (formatData.eras[calendar.get (Calendar.ERA)],
DateFormat.Field.ERA);
break;
case YEAR_FIELD:
// If we have two digits, then we truncate. Otherwise, we
// use the size of the pattern, and zero pad.
+ buffer.setDefaultAttribute (DateFormat.Field.YEAR);
if (p.size == 2)
{
- temp = String.valueOf(calendar.get(Calendar.YEAR));
- buffer.append(temp.substring(temp.length() - 2));
+ temp = String.valueOf (calendar.get (Calendar.YEAR));
+ buffer.append (temp.substring (temp.length() - 2));
}
else
- withLeadingZeros(calendar.get(Calendar.YEAR), p.size, buffer);
+ withLeadingZeros (calendar.get (Calendar.YEAR), p.size,
buffer);
break;
case MONTH_FIELD:
+ buffer.setDefaultAttribute (DateFormat.Field.MONTH);
if (p.size < 3)
- withLeadingZeros(calendar.get(Calendar.MONTH)+1,p.size,buffer);
+ withLeadingZeros (calendar.get (Calendar.MONTH) + 1, p.size,
buffer);
else if (p.size < 4)
- buffer.append(formatData.shortMonths[calendar.get(Calendar.MONTH)]);
+ buffer.append (formatData.shortMonths[calendar.get
(Calendar.MONTH)]);
else
- buffer.append(formatData.months[calendar.get(Calendar.MONTH)]);
+ buffer.append (formatData.months[calendar.get
(Calendar.MONTH)]);
break;
case DATE_FIELD:
- withLeadingZeros(calendar.get(Calendar.DATE),p.size,buffer);
+ buffer.setDefaultAttribute (DateFormat.Field.DAY_OF_MONTH);
+ withLeadingZeros (calendar.get (Calendar.DATE), p.size, buffer);
break;
case HOUR_OF_DAY1_FIELD: // 1-24
-
withLeadingZeros(((calendar.get(Calendar.HOUR_OF_DAY)+23)%24)+1,p.size,buffer);
+ buffer.setDefaultAttribute(DateFormat.Field.HOUR_OF_DAY1);
+ withLeadingZeros ( ((calendar.get (Calendar.HOUR_OF_DAY) + 23)
% 24) + 1,
+ p.size, buffer);
break;
case HOUR_OF_DAY0_FIELD: // 0-23
- withLeadingZeros(calendar.get(Calendar.HOUR_OF_DAY),p.size,buffer);
+ buffer.setDefaultAttribute (DateFormat.Field.HOUR_OF_DAY0);
+ withLeadingZeros (calendar.get (Calendar.HOUR_OF_DAY), p.size,
buffer);
break;
case MINUTE_FIELD:
- withLeadingZeros(calendar.get(Calendar.MINUTE),p.size,buffer);
+ buffer.setDefaultAttribute (DateFormat.Field.MINUTE);
+ withLeadingZeros (calendar.get (Calendar.MINUTE),
+ p.size, buffer);
break;
case SECOND_FIELD:
- withLeadingZeros(calendar.get(Calendar.SECOND),p.size,buffer);
+ buffer.setDefaultAttribute (DateFormat.Field.SECOND);
+ withLeadingZeros(calendar.get (Calendar.SECOND),
+ p.size, buffer);
break;
case MILLISECOND_FIELD:
- withLeadingZeros(calendar.get(Calendar.MILLISECOND),p.size,buffer);
+ buffer.setDefaultAttribute (DateFormat.Field.MILLISECOND);
+ withLeadingZeros (calendar.get (Calendar.MILLISECOND), p.size,
buffer);
break;
case DAY_OF_WEEK_FIELD:
+ buffer.setDefaultAttribute (DateFormat.Field.DAY_OF_WEEK);
if (p.size < 4)
-
buffer.append(formatData.shortWeekdays[calendar.get(Calendar.DAY_OF_WEEK)]);
+ buffer.append (formatData.shortWeekdays[calendar.get
(Calendar.DAY_OF_WEEK)]);
else
-
buffer.append(formatData.weekdays[calendar.get(Calendar.DAY_OF_WEEK)]);
+ buffer.append (formatData.weekdays[calendar.get
(Calendar.DAY_OF_WEEK)]);
break;
case DAY_OF_YEAR_FIELD:
- withLeadingZeros(calendar.get(Calendar.DAY_OF_YEAR),p.size,buffer);
+ buffer.setDefaultAttribute (DateFormat.Field.DAY_OF_YEAR);
+ withLeadingZeros (calendar.get (Calendar.DAY_OF_YEAR), p.size,
buffer);
break;
case DAY_OF_WEEK_IN_MONTH_FIELD:
-
withLeadingZeros(calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH),p.size,buffer);
+ buffer.setDefaultAttribute
(DateFormat.Field.DAY_OF_WEEK_IN_MONTH);
+ withLeadingZeros (calendar.get (Calendar.DAY_OF_WEEK_IN_MONTH),
+ p.size, buffer);
break;
case WEEK_OF_YEAR_FIELD:
- withLeadingZeros(calendar.get(Calendar.WEEK_OF_YEAR),p.size,buffer);
+ buffer.setDefaultAttribute (DateFormat.Field.WEEK_OF_YEAR);
+ withLeadingZeros (calendar.get (Calendar.WEEK_OF_YEAR),
+ p.size, buffer);
break;
case WEEK_OF_MONTH_FIELD:
- withLeadingZeros(calendar.get(Calendar.WEEK_OF_MONTH),p.size,buffer);
+ buffer.setDefaultAttribute (DateFormat.Field.WEEK_OF_MONTH);
+ withLeadingZeros (calendar.get (Calendar.WEEK_OF_MONTH),
+ p.size, buffer);
break;
case AM_PM_FIELD:
- buffer.append(formatData.ampms[calendar.get(Calendar.AM_PM)]);
+ buffer.setDefaultAttribute (DateFormat.Field.AM_PM);
+ buffer.append (formatData.ampms[calendar.get (Calendar.AM_PM)]);
break;
case HOUR1_FIELD: // 1-12
-
withLeadingZeros(((calendar.get(Calendar.HOUR)+11)%12)+1,p.size,buffer);
+ buffer.setDefaultAttribute (DateFormat.Field.HOUR1);
+ withLeadingZeros (((calendar.get (Calendar.HOUR) + 11) % 12) +
1, p.size, buffer);
break;
case HOUR0_FIELD: // 0-11
- withLeadingZeros(calendar.get(Calendar.HOUR),p.size,buffer);
+ buffer.setDefaultAttribute (DateFormat.Field.HOUR0);
+ withLeadingZeros (calendar.get (Calendar.HOUR), p.size, buffer);
break;
case TIMEZONE_FIELD:
+ buffer.setDefaultAttribute (DateFormat.Field.TIME_ZONE);
TimeZone zone = calendar.getTimeZone();
- boolean isDST = calendar.get(Calendar.DST_OFFSET) != 0;
+ boolean isDST = calendar.get (Calendar.DST_OFFSET) != 0;
// FIXME: XXX: This should be a localized time zone.
- String zoneID = zone.getDisplayName(isDST, p.size > 3 ? TimeZone.LONG
: TimeZone.SHORT);
- buffer.append(zoneID);
+ String zoneID = zone.getDisplayName (isDST, p.size > 3 ?
TimeZone.LONG : TimeZone.SHORT);
+ buffer.append (zoneID);
break;
default:
- throw new IllegalArgumentException("Illegal pattern character");
+ throw new IllegalArgumentException ("Illegal pattern character
" + p.field);
}
- if (pos != null && p.field == pos.getField())
+ if (pos != null && (buffer.getDefaultAttribute() ==
pos.getFieldAttribute()
+ || p.field == pos.getField()))
{
pos.setBeginIndex(beginIndex);
pos.setEndIndex(buffer.length());
}
- } else {
- buffer.append(o.toString());
+ }
+ else
+ {
+ buffer.append(o.toString(), null);
}
}
+ }
+
+ public StringBuffer format(Date date, StringBuffer buffer, FieldPosition pos)
+ {
+ formatWithAttribute(date, new StringFormatBuffer (buffer), pos);
+
return buffer;
}
- private void withLeadingZeros(int value, int length, StringBuffer buffer)
+ public AttributedCharacterIterator formatToCharacterIterator(Object date)
+ throws IllegalArgumentException
+ {
+ if (date == null)
+ throw new NullPointerException("null argument");
+ if (!(date instanceof Date))
+ throw new IllegalArgumentException("argument should be an instance of
java.util.Date");
+
+ AttributedFormatBuffer buf = new AttributedFormatBuffer();
+ formatWithAttribute((Date)date, buf,
+ null);
+ buf.sync();
+
+ return new FormatCharacterIterator(buf.getBuffer().toString(),
+ buf.getRanges(),
+ buf.getAttributes());
+ }
+
+ private void withLeadingZeros(int value, int length, FormatBuffer buffer)
{
String valStr = String.valueOf(value);
for (length -= valStr.length(); length > 0; length--)
pgp4JIgnKQkKQ.pgp
Description: PGP signature
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- java.text.SimpleDateFormat,
Guilhem Lavaux <=