gcc/libjava/java/text/DateFormat.java

302 lines
6.8 KiB
Java
Raw Normal View History

1999-04-07 22:42:40 +08:00
/* 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);
}
}