diff options
Diffstat (limited to 'libjava/java/text/DateFormat.java')
-rw-r--r-- | libjava/java/text/DateFormat.java | 301 |
1 files changed, 301 insertions, 0 deletions
diff --git a/libjava/java/text/DateFormat.java b/libjava/java/text/DateFormat.java new file mode 100644 index 00000000000..bfd6b01a777 --- /dev/null +++ b/libjava/java/text/DateFormat.java @@ -0,0 +1,301 @@ +/* Copyright (C) 1998, 1999 Cygnus Solutions + + This file is part of libgcj. + +This software is copyrighted work licensed under the terms of the +Libgcj License. Please consult the file "LIBGCJ_LICENSE" for +details. */ + +package java.text; + +import java.util.*; + +/** + * @author Per Bothner <bothner@cygnus.com> + * @date October 25, 1998. + */ +/* Written using "Java Class Libraries", 2nd edition, plus online + * API docs for JDK 1.2 beta from http://www.javasoft.com. + * Status: Mostly complete; search for FIXME to see omissions. + */ + +public abstract class DateFormat extends Format implements Cloneable +{ + protected Calendar calendar; + protected NumberFormat numberFormat; + + // (Values determined using a test program.) + public final static int FULL = 0; + public final static int LONG = 1; + public final static int MEDIUM = 2; + public final static int SHORT = 3; + public final static int DEFAULT = MEDIUM; + + public final static int ERA_FIELD = 0; + public final static int YEAR_FIELD = 1; + public final static int MONTH_FIELD = 2; + public final static int DATE_FIELD = 3; + public final static int HOUR_OF_DAY1_FIELD = 4; + public final static int HOUR_OF_DAY0_FIELD = 5; + public final static int MINUTE_FIELD = 6; + public final static int SECOND_FIELD = 7; + public final static int MILLISECOND_FIELD = 8; + public final static int DAY_OF_WEEK_FIELD = 9; + public final static int DAY_OF_YEAR_FIELD = 10; + public final static int DAY_OF_WEEK_IN_MONTH_FIELD = 11; + public final static int WEEK_OF_YEAR_FIELD = 12; + public final static int WEEK_OF_MONTH_FIELD = 13; + public final static int AM_PM_FIELD = 14; + public final static int HOUR1_FIELD = 15; + public final static int HOUR0_FIELD = 16; + public final static int TIMEZONE_FIELD = 17; + + protected DateFormat () + { + } + + public boolean equals (Object obj) + { + if (! (obj instanceof DateFormat)) + return false; + DateFormat d = (DateFormat) obj; + return calendar.equals(d.calendar) && numberFormat.equals(d.numberFormat); + } + + public final StringBuffer format (Object obj, + StringBuffer buf, FieldPosition pos) + { + if (obj instanceof Number) + return format (new Date(((Number) obj).longValue()), buf, pos); + return format ((Date) obj, buf, pos); + } + + public final String format (Date date) + { + StringBuffer sb = new StringBuffer (); + format (date, sb, new FieldPosition (MONTH_FIELD)); + return sb.toString(); + } + + public abstract StringBuffer format (Date date, + StringBuffer buf, FieldPosition pos); + + public static Locale[] getAvailableLocales () + { + return null; // FIXME + } + + public Calendar getCalendar () + { + return calendar; + } + + private static final DateFormat computeInstance (int style, Locale loc, + boolean use_date, + boolean use_time) + { + ResourceBundle res; + try + { + res = ResourceBundle.getBundle("gnu.gcj.text.LocaleData", loc); + } + catch (MissingResourceException x) + { + res = null; + } + + String pattern = null; + if (use_date) + { + String name, def; + switch (style) + { + case FULL: + name = "fullDateFormat"; + def = "EEEE MMMM d, yyyy G"; + break; + case LONG: + name = "longDateFormat"; + def = "MMMM d, yyyy"; + break; + case MEDIUM: + name = "mediumDateFormat"; + def = "d-MMM-yy"; + break; + case SHORT: + name = "shortDateFormat"; + def = "M/d/yy"; + break; + default: + throw new IllegalArgumentException (); + } + try + { + pattern = res == null ? def : res.getString(name); + } + catch (MissingResourceException x) + { + pattern = def; + } + } + + if (use_time) + { + if (pattern == null) + pattern = ""; + else + pattern += " "; + + String name, def; + switch (style) + { + case FULL: + name = "fullTimeFormat"; + def = "h:mm:ss;S 'o''clock' a z"; + break; + case LONG: + name = "longTimeFormat"; + def = "h:mm:ss a z"; + break; + case MEDIUM: + name = "mediumTimeFormat"; + def = "h:mm:ss a"; + break; + case SHORT: + name = "shortTimeFormat"; + def = "h:mm a"; + break; + default: + throw new IllegalArgumentException (); + } + + String s; + try + { + s = res == null ? def : res.getString(name); + } + catch (MissingResourceException x) + { + s = def; + } + pattern += s; + } + + return new SimpleDateFormat (pattern, loc); + } + + public static final DateFormat getDateInstance () + { + return getDateInstance (DEFAULT, Locale.getDefault()); + } + + public static final DateFormat getDateInstance (int style) + { + return getDateInstance (style, Locale.getDefault()); + } + + public static final DateFormat getDateInstance (int style, Locale loc) + { + return computeInstance (style, loc, true, false); + } + + public static final DateFormat getDateTimeInstance () + { + return getDateTimeInstance (DEFAULT, Locale.getDefault()); + } + + public static final DateFormat getDateTimeInstance (int style) + { + return getDateTimeInstance (style, Locale.getDefault()); + } + + public static final DateFormat getDateTimeInstance (int style, Locale loc) + { + return computeInstance (style, loc, true, true); + } + + public static final DateFormat getInstance () + { + // JCL book says SHORT. + return getDateTimeInstance (SHORT, Locale.getDefault()); + } + + public NumberFormat getNumberFormat () + { + return numberFormat; + } + + public static final DateFormat getTimeInstance () + { + return getTimeInstance (DEFAULT, Locale.getDefault()); + } + + public static final DateFormat getTimeInstance (int style) + { + return getTimeInstance (style, Locale.getDefault()); + } + + public static final DateFormat getTimeInstance (int style, Locale loc) + { + return computeInstance (style, loc, false, true); + } + + public TimeZone getTimeZone () + { + return calendar.getTimeZone(); + } + + public int hashCode () + { + int hash = calendar.hashCode(); + if (numberFormat != null) + hash ^= numberFormat.hashCode(); + return hash; + } + + public boolean isLenient () + { + return calendar.isLenient(); + } + + public Date parse (String source) throws ParseException + { + ParsePosition pos = new ParsePosition(0); + Date result = parse (source, pos); + if (result == null) + { + int index = pos.getErrorIndex(); + if (index < 0) + index = pos.getIndex(); + throw new ParseException("invalid Date syntax", index); + } + return result; + } + + public abstract Date parse (String source, ParsePosition pos); + + public Object parseObject (String source, ParsePosition pos) + { + return parse(source, pos); + } + + public void setCalendar (Calendar calendar) + { + this.calendar = calendar; + } + + public void setLenient (boolean lenient) + { + calendar.setLenient(lenient); + } + + public void setNumberFormat (NumberFormat numberFormat) + { + this.numberFormat = numberFormat; + } + + public void setTimeZone (TimeZone timeZone) + { + calendar.setTimeZone(timeZone); + } +} |