mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			922 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			922 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			Java
		
	
	
	
| /* DateFormat.java -- Class for formatting/parsing date/times
 | |
|    Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004, 2005
 | |
|    Free Software Foundation, Inc.
 | |
| 
 | |
| This file is part of GNU Classpath.
 | |
| 
 | |
| GNU Classpath is free software; you can redistribute it and/or modify
 | |
| it under the terms of the GNU General Public License as published by
 | |
| the Free Software Foundation; either version 2, or (at your option)
 | |
| any later version.
 | |
|  
 | |
| GNU Classpath is distributed in the hope that it will be useful, but
 | |
| WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
| General Public License for more details.
 | |
| 
 | |
| You should have received a copy of the GNU General Public License
 | |
| along with GNU Classpath; see the file COPYING.  If not, write to the
 | |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | |
| 02110-1301 USA.
 | |
| 
 | |
| Linking this library statically or dynamically with other modules is
 | |
| making a combined work based on this library.  Thus, the terms and
 | |
| conditions of the GNU General Public License cover the whole
 | |
| combination.
 | |
| 
 | |
| As a special exception, the copyright holders of this library give you
 | |
| permission to link this library with independent modules to produce an
 | |
| executable, regardless of the license terms of these independent
 | |
| modules, and to copy and distribute the resulting executable under
 | |
| terms of your choice, provided that you also meet, for each linked
 | |
| independent module, the terms and conditions of the license of that
 | |
| module.  An independent module is a module which is not derived from
 | |
| or based on this library.  If you modify this library, you may extend
 | |
| this exception to your version of the library, but you are not
 | |
| obligated to do so.  If you do not wish to do so, delete this
 | |
| exception statement from your version. */
 | |
| 
 | |
| 
 | |
| package java.text;
 | |
| 
 | |
| import java.io.InvalidObjectException;
 | |
| import java.util.Calendar;
 | |
| import java.util.Date;
 | |
| import java.util.Locale;
 | |
| import java.util.MissingResourceException;
 | |
| import java.util.ResourceBundle;
 | |
| import java.util.TimeZone;
 | |
| 
 | |
| /**
 | |
|  * @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
 | |
| {
 | |
|   private static final long serialVersionUID = 7218322306649953788L;
 | |
| 
 | |
|   // Names fixed by serialization spec.
 | |
|   protected Calendar calendar;
 | |
|   protected NumberFormat numberFormat;
 | |
| 
 | |
|   // (Values determined using a test program.)
 | |
|   public static final int FULL = 0;
 | |
|   public static final int LONG = 1;
 | |
|   public static final int MEDIUM = 2;
 | |
|   public static final int SHORT = 3;
 | |
|   public static final int DEFAULT = MEDIUM;
 | |
| 
 | |
|   /* These constants need to have these exact values.  They
 | |
|    * correspond to index positions within the localPatternChars
 | |
|    * string for a given locale.  Each locale may specify its
 | |
|    * own character for a particular field, but the position
 | |
|    * of these characters must correspond to an appropriate field
 | |
|    * number (as listed below), in order for their meaning to
 | |
|    * be determined.  For example, the US locale uses
 | |
|    * the string "GyMdkHmsSEDFwWahKzYeugAZ", where 'G' is the character
 | |
|    * for era, 'y' for year, and so on down to 'Z' for time zone.
 | |
|    */
 | |
|   /**
 | |
|    * Represents the position of the era
 | |
|    * pattern character in the array of
 | |
|    * localized pattern characters. 
 | |
|    * For example, 'AD' is an era used
 | |
|    * in the Gregorian calendar system.
 | |
|    * In the U.S. locale, this is 'G'.
 | |
|    */  
 | |
|   public static final int ERA_FIELD = 0;
 | |
|   /**
 | |
|    * Represents the position of the year
 | |
|    * pattern character in the array of
 | |
|    * localized pattern characters.
 | |
|    * In the U.S. locale, this is 'y'.
 | |
|    */
 | |
|   public static final int YEAR_FIELD = 1;
 | |
|   /**
 | |
|    * Represents the position of the month
 | |
|    * pattern character in the array of
 | |
|    * localized pattern characters.
 | |
|    * In the U.S. locale, this is 'M'.
 | |
|    */
 | |
|   public static final int MONTH_FIELD = 2;
 | |
|   /**
 | |
|    * Represents the position of the date
 | |
|    * or day of the month pattern character
 | |
|    * in the array of localized pattern
 | |
|    * characters.  In the U.S. locale,
 | |
|    * this is 'd'.
 | |
|    */
 | |
|   public static final int DATE_FIELD = 3;
 | |
|   /**
 | |
|    * Represents the position of the 24
 | |
|    * hour pattern character in the array of
 | |
|    * localized pattern characters.
 | |
|    * In the U.S. locale, this is 'k'.
 | |
|    * This field numbers hours from 1 to 24.
 | |
|    */
 | |
|   public static final int HOUR_OF_DAY1_FIELD = 4;
 | |
|   /**
 | |
|    * Represents the position of the 24
 | |
|    * hour pattern character in the array of
 | |
|    * localized pattern characters.
 | |
|    * In the U.S. locale, this is 'H'.
 | |
|    * This field numbers hours from 0 to 23.
 | |
|    */
 | |
|   public static final int HOUR_OF_DAY0_FIELD = 5;
 | |
|   /**
 | |
|    * Represents the position of the minute
 | |
|    * pattern character in the array of
 | |
|    * localized pattern characters.
 | |
|    * In the U.S. locale, this is 'm'.
 | |
|    */
 | |
|   public static final int MINUTE_FIELD = 6;
 | |
|   /**
 | |
|    * Represents the position of the second
 | |
|    * pattern character in the array of
 | |
|    * localized pattern characters.
 | |
|    * In the U.S. locale, this is 's'.
 | |
|    */
 | |
|   public static final int SECOND_FIELD = 7;
 | |
|   /**
 | |
|    * Represents the position of the millisecond
 | |
|    * pattern character in the array of
 | |
|    * localized pattern characters.
 | |
|    * In the U.S. locale, this is 'S'.
 | |
|    */
 | |
|   public static final int MILLISECOND_FIELD = 8;
 | |
|   /**
 | |
|    * Represents the position of the day of the
 | |
|    * week pattern character in the array of
 | |
|    * localized pattern characters.
 | |
|    * In the U.S. locale, this is 'E'.
 | |
|    */
 | |
|   public static final int DAY_OF_WEEK_FIELD = 9;
 | |
|   /**
 | |
|    * Represents the position of the day of the
 | |
|    * year pattern character in the array of
 | |
|    * localized pattern characters.
 | |
|    * In the U.S. locale, this is 'D'.
 | |
|    */
 | |
|   public static final int DAY_OF_YEAR_FIELD = 10;
 | |
|   /**
 | |
|    * Represents the position of the day of the
 | |
|    * week in the month pattern character in the
 | |
|    * array of localized pattern characters.
 | |
|    * In the U.S. locale, this is 'F'.
 | |
|    */
 | |
|   public static final int DAY_OF_WEEK_IN_MONTH_FIELD = 11;
 | |
|   /**
 | |
|    * Represents the position of the week of the
 | |
|    * year pattern character in the array of
 | |
|    * localized pattern characters.
 | |
|    * In the U.S. locale, this is 'w'.
 | |
|    */
 | |
|   public static final int WEEK_OF_YEAR_FIELD = 12;
 | |
|   /**
 | |
|    * Represents the position of the week of the
 | |
|    * month pattern character in the array of
 | |
|    * localized pattern characters.
 | |
|    * In the U.S. locale, this is 'W'.
 | |
|    */
 | |
|   public static final int WEEK_OF_MONTH_FIELD = 13;
 | |
|   /**
 | |
|    * Represents the position of the am/pm
 | |
|    * pattern character in the array of
 | |
|    * localized pattern characters.
 | |
|    * In the U.S. locale, this is 'a'.
 | |
|    */
 | |
|   public static final int AM_PM_FIELD = 14;
 | |
|   /**
 | |
|    * Represents the position of the 12 
 | |
|    * hour pattern character in the array of
 | |
|    * localized pattern characters.
 | |
|    * In the U.S. locale, this is 'h'.
 | |
|    * This field numbers hours from 1 to 12.
 | |
|    */
 | |
|   public static final int HOUR1_FIELD = 15;
 | |
|   /**
 | |
|    * Represents the position of the 12 
 | |
|    * hour pattern character in the array of
 | |
|    * localized pattern characters.
 | |
|    * In the U.S. locale, this is 'K'.
 | |
|    * This field numbers hours from 0 to 11.
 | |
|    */
 | |
|   public static final int HOUR0_FIELD = 16;
 | |
|   /**
 | |
|    * Represents the position of the generic
 | |
|    * timezone pattern character in the array of
 | |
|    * localized pattern characters.
 | |
|    * In the U.S. locale, this is 'z'.
 | |
|    */
 | |
|   public static final int TIMEZONE_FIELD = 17;
 | |
|   /**
 | |
|    * Represents the position of the ISO year
 | |
|    * pattern character in the array of
 | |
|    * localized pattern characters.
 | |
|    * In the U.S. locale, this is 'Y'.
 | |
|    * This is a GNU extension in accordance with
 | |
|    * the CLDR data used.  This value may
 | |
|    * differ from the normal year value.
 | |
|    */
 | |
|   public static final int ISO_YEAR_FIELD = 18;
 | |
|   /**
 | |
|    * Represents the position of the localized
 | |
|    * day of the week pattern character in the
 | |
|    * array of localized pattern characters.
 | |
|    * In the U.S. locale, this is 'e'.
 | |
|    * This is a GNU extension in accordance with
 | |
|    * the CLDR data used.  This value only
 | |
|    * differs from the day of the week with
 | |
|    * numeric formatting, in which case the
 | |
|    * locale's first day of the week is used.
 | |
|    */
 | |
|   public static final int LOCALIZED_DAY_OF_WEEK_FIELD = 19;
 | |
|   /**
 | |
|    * Represents the position of the extended year
 | |
|    * pattern character in the array of
 | |
|    * localized pattern characters.
 | |
|    * In the U.S. locale, this is 'u'.
 | |
|    * This is a GNU extension in accordance with
 | |
|    * the CLDR data used.  This value modifies
 | |
|    * the year value, so as to incorporate the era.
 | |
|    * For example, in the Gregorian calendar system,
 | |
|    * the extended year is negative instead of being
 | |
|    * marked as BC.
 | |
|    */
 | |
|   public static final int EXTENDED_YEAR_FIELD = 20;
 | |
|   /**
 | |
|    * Represents the position of the modified Julian
 | |
|    * day pattern character in the array of
 | |
|    * localized pattern characters.
 | |
|    * In the U.S. locale, this is 'g'.
 | |
|    * This is a GNU extension in accordance with
 | |
|    * the CLDR data used.  This value differs
 | |
|    * from the standard Julian day in that days
 | |
|    * are marked from midnight onwards rather than
 | |
|    * noon, and the local time zone affects the value.
 | |
|    * In simple terms, it can be thought of as all
 | |
|    * the date fields represented as a single number.
 | |
|    */
 | |
|   public static final int MODIFIED_JULIAN_DAY_FIELD = 21;
 | |
|   /**
 | |
|    * Represents the position of the millisecond
 | |
|    * in the day pattern character in the array of
 | |
|    * localized pattern characters.
 | |
|    * In the U.S. locale, this is 'A'.
 | |
|    * This is a GNU extension in accordance with
 | |
|    * the CLDR data used.  This value represents
 | |
|    * all the time fields (excluding the time zone)
 | |
|    * numerically, giving the number of milliseconds
 | |
|    * into the day (e.g. 10 in the morning would
 | |
|    * be 10 * 60 * 60 * 1000).  Any daylight savings
 | |
|    * offset also affects this value.
 | |
|    */
 | |
|   public static final int MILLISECOND_IN_DAY_FIELD = 22;
 | |
|   /**
 | |
|    * Represents the position of the RFC822
 | |
|    * timezone pattern character in the array of
 | |
|    * localized pattern characters.
 | |
|    * In the U.S. locale, this is 'Z'.
 | |
|    * This is a GNU extension in accordance with
 | |
|    * the CLDR data used.  The value is the offset
 | |
|    * of the current time from GMT e.g. -0500 would
 | |
|    * be five hours prior to GMT.
 | |
|    */
 | |
|   public static final int RFC822_TIMEZONE_FIELD = 23;
 | |
| 
 | |
|   public static class Field extends Format.Field
 | |
|   {
 | |
|     static final long serialVersionUID = 7441350119349544720L;
 | |
|     
 | |
|     private int calendarField;
 | |
| 
 | |
|     public static final DateFormat.Field ERA
 | |
| 	= new Field("era", Calendar.ERA);
 | |
|     public static final DateFormat.Field YEAR
 | |
| 	= new Field("year", Calendar.YEAR);
 | |
|     public static final DateFormat.Field MONTH
 | |
| 	= new Field("month", Calendar.MONTH);
 | |
|     public static final DateFormat.Field DAY_OF_MONTH
 | |
| 	= new Field("day of month", Calendar.DAY_OF_MONTH);
 | |
|     public static final DateFormat.Field HOUR_OF_DAY1
 | |
| 	= new Field("hour of day 1", Calendar.HOUR_OF_DAY);
 | |
|     public static final DateFormat.Field HOUR_OF_DAY0
 | |
| 	= new Field("hour of day 0", Calendar.HOUR_OF_DAY);
 | |
|     public static final DateFormat.Field MINUTE
 | |
| 	= new Field("minute", Calendar.MINUTE);
 | |
|     public static final DateFormat.Field SECOND
 | |
| 	= new Field("second", Calendar.SECOND);
 | |
|     public static final DateFormat.Field MILLISECOND
 | |
| 	= new Field("millisecond", Calendar.MILLISECOND);
 | |
|     public static final DateFormat.Field DAY_OF_WEEK
 | |
| 	= new Field("day of week", Calendar.DAY_OF_WEEK);
 | |
|     public static final DateFormat.Field DAY_OF_YEAR
 | |
| 	= new Field("day of year", Calendar.DAY_OF_YEAR);
 | |
|     public static final DateFormat.Field DAY_OF_WEEK_IN_MONTH
 | |
| 	= new Field("day of week in month", Calendar.DAY_OF_WEEK_IN_MONTH);
 | |
|     public static final DateFormat.Field WEEK_OF_YEAR
 | |
| 	= new Field("week of year", Calendar.WEEK_OF_YEAR);
 | |
|     public static final DateFormat.Field WEEK_OF_MONTH
 | |
| 	= new Field("week of month", Calendar.WEEK_OF_MONTH);
 | |
|     public static final DateFormat.Field AM_PM
 | |
| 	= new Field("am/pm", Calendar.AM_PM);
 | |
|     public static final DateFormat.Field HOUR1
 | |
| 	= new Field("hour1", Calendar.HOUR);
 | |
|     public static final DateFormat.Field HOUR0
 | |
| 	= new Field("hour0", Calendar.HOUR);
 | |
|     public static final DateFormat.Field TIME_ZONE
 | |
| 	= new Field("timezone", Calendar.ZONE_OFFSET);
 | |
|     public static final DateFormat.Field ISO_YEAR
 | |
| 	= new Field("iso year", Calendar.YEAR);
 | |
|     public static final DateFormat.Field LOCALIZED_DAY_OF_WEEK
 | |
| 	= new Field("localized day of week", Calendar.DAY_OF_WEEK);
 | |
|     public static final DateFormat.Field EXTENDED_YEAR
 | |
|       = new Field("extended year", Calendar.YEAR);
 | |
|     public static final DateFormat.Field MODIFIED_JULIAN_DAY
 | |
| 	= new Field("julian day", -1);
 | |
|     public static final DateFormat.Field MILLISECOND_IN_DAY
 | |
| 	= new Field("millisecond in day", -1);
 | |
|     public static final DateFormat.Field RFC822_TIME_ZONE
 | |
| 	= new Field("rfc822 timezone", Calendar.ZONE_OFFSET);
 | |
| 
 | |
|     static final DateFormat.Field[] allFields =
 | |
|     {
 | |
|       ERA, YEAR, MONTH, DAY_OF_MONTH, HOUR_OF_DAY1,
 | |
|       HOUR_OF_DAY0, MINUTE, SECOND, MILLISECOND,
 | |
|       DAY_OF_WEEK, DAY_OF_YEAR, DAY_OF_WEEK_IN_MONTH,
 | |
|       WEEK_OF_YEAR, WEEK_OF_MONTH, AM_PM, HOUR1, HOUR0,
 | |
|       TIME_ZONE, ISO_YEAR, LOCALIZED_DAY_OF_WEEK,
 | |
|       EXTENDED_YEAR, MODIFIED_JULIAN_DAY, MILLISECOND_IN_DAY,
 | |
|       RFC822_TIME_ZONE
 | |
|     };
 | |
| 
 | |
|     // For deserialization
 | |
|     private Field()
 | |
|     {
 | |
|       super("");
 | |
|     }
 | |
| 
 | |
|     protected Field(String name, int calendarField)
 | |
|     {
 | |
|       super(name);
 | |
|       this.calendarField = calendarField;
 | |
|     }
 | |
|     
 | |
|     public int getCalendarField()
 | |
|     {
 | |
|       return calendarField;
 | |
|     }
 | |
| 
 | |
|     public static Field ofCalendarField(int calendarField)
 | |
|     {
 | |
|       if (calendarField >= allFields.length || calendarField < 0)
 | |
| 	throw new IllegalArgumentException("no such calendar field ("
 | |
| 					   + calendarField + ")");
 | |
|       
 | |
|       return allFields[calendarField];
 | |
|     }
 | |
|     
 | |
|     protected Object readResolve() throws InvalidObjectException
 | |
|     {
 | |
|       String s = getName();
 | |
| 
 | |
|       for (int i=0;i<allFields.length;i++)
 | |
| 	if (s.equals(allFields[i].getName()))
 | |
| 	  return allFields[i];
 | |
|       
 | |
|       throw new InvalidObjectException("no such DateFormat field called " + s);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method initializes a new instance of <code>DateFormat</code>.
 | |
|    */
 | |
|   protected DateFormat ()
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method tests this object for equality against the specified object.
 | |
|    * The two objects will be considered equal if an only if the specified
 | |
|    * object:
 | |
|    * <P>
 | |
|    * <ul>
 | |
|    * <li>Is not <code>null</code>.</li>
 | |
|    * <li>Is an instance of <code>DateFormat</code>.</li>
 | |
|    * <li>Has equal numberFormat field as this object.</li>
 | |
|    * <li>Has equal (Calendar) TimeZone rules as this object.</li>
 | |
|    * <li>Has equal (Calendar) isLenient results.</li> 
 | |
|    * <li>Has equal Calendar first day of week and minimal days in week
 | |
|    * values.</li>
 | |
|    * </ul>
 | |
|    * Note that not all properties of the Calendar are relevant for a
 | |
|    * DateFormat. For formatting only the fact whether or not the
 | |
|    * TimeZone has the same rules and whether the calendar is lenient
 | |
|    * and has the same week rules is compared for this implementation
 | |
|    * of equals. Other properties of the Calendar (such as the time)
 | |
|    * are not taken into account.
 | |
|    *
 | |
|    * @param obj The object to test for equality against.
 | |
|    * 
 | |
|    * @return <code>true</code> if the specified object is equal to this object,
 | |
|    * <code>false</code> otherwise.
 | |
|    */
 | |
|   public boolean equals (Object obj)
 | |
|   {
 | |
|     if (!(obj instanceof DateFormat))
 | |
|       return false;
 | |
| 
 | |
|     DateFormat d = (DateFormat) obj;
 | |
|     TimeZone tz = getTimeZone();
 | |
|     TimeZone tzd = d.getTimeZone();
 | |
|     if (tz.hasSameRules(tzd))
 | |
|       if (isLenient() == d.isLenient())
 | |
| 	{
 | |
| 	  Calendar c = getCalendar();
 | |
| 	  Calendar cd = d.getCalendar();
 | |
| 	  if ((c == null && cd == null)
 | |
| 	      ||
 | |
| 	      (c.getFirstDayOfWeek() == cd.getFirstDayOfWeek()
 | |
| 	       &&
 | |
| 	       c.getMinimalDaysInFirstWeek()
 | |
| 	       == cd.getMinimalDaysInFirstWeek()))
 | |
| 	    return ((numberFormat == null && d.numberFormat == null)
 | |
| 		    || numberFormat.equals(d.numberFormat));
 | |
| 	}
 | |
| 
 | |
|     return false;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns a copy of this object.
 | |
|    *
 | |
|    * @return A copy of this object.
 | |
|    */
 | |
|   public Object clone ()
 | |
|   {
 | |
|     // We know the superclass just call's Object's generic cloner.
 | |
|     return super.clone ();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method formats the specified <code>Object</code> into a date string
 | |
|    * and appends it to the specified <code>StringBuffer</code>.
 | |
|    * The specified object must be an instance of <code>Number</code> or
 | |
|    * <code>Date</code> or an <code>IllegalArgumentException</code> will be
 | |
|    * thrown.
 | |
|    *
 | |
|    * @param obj The <code>Object</code> to format.
 | |
|    * @param buf The <code>StringBuffer</code> to append the resultant
 | |
|    * <code>String</code> to.
 | |
|    * @param pos Is updated to the start and end index of the
 | |
|    * specified field.
 | |
|    *
 | |
|    * @return The <code>StringBuffer</code> supplied on input, with the
 | |
|    * formatted date/time appended.
 | |
|    */
 | |
|   public final StringBuffer format (Object obj,
 | |
| 				    StringBuffer buf, FieldPosition pos)
 | |
|   {
 | |
|     if (obj instanceof Number)
 | |
|       obj = new Date(((Number) obj).longValue());
 | |
|     else if (! (obj instanceof Date))
 | |
|       throw new IllegalArgumentException
 | |
| 	("Cannot format given Object as a Date");
 | |
| 
 | |
|     return format ((Date) obj, buf, pos);
 | |
|   }
 | |
| 
 | |
|   /**  
 | |
|     * Formats the date argument according to the pattern specified. 
 | |
|     *
 | |
|     * @param date The formatted date.
 | |
|     */
 | |
|   public final String format (Date date)
 | |
|   {
 | |
|     StringBuffer sb = new StringBuffer ();
 | |
|     format (date, sb, new FieldPosition (MONTH_FIELD));
 | |
|     return sb.toString();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method formats a <code>Date</code> into a string and appends it
 | |
|    * to the specified <code>StringBuffer</code>.
 | |
|    *
 | |
|    * @param date The <code>Date</code> value to format.
 | |
|    * @param buf The <code>StringBuffer</code> to append the resultant
 | |
|    * <code>String</code> to.
 | |
|    * @param pos Is updated to the start and end index of the
 | |
|    * specified field.
 | |
|    *
 | |
|    * @return The <code>StringBuffer</code> supplied on input, with the
 | |
|    * formatted date/time appended.
 | |
|    */
 | |
|   public abstract StringBuffer format (Date date,
 | |
| 				       StringBuffer buf, FieldPosition pos);
 | |
| 
 | |
|   /**
 | |
|    * This method returns a list of available locales supported by this
 | |
|    * class.
 | |
|    */
 | |
|   public static Locale[] getAvailableLocales()
 | |
|   {
 | |
|     return Locale.getAvailableLocales();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|     * This method returns the <code>Calendar</code> object being used by
 | |
|     * this object to parse/format datetimes.
 | |
|     *
 | |
|     * @return The <code>Calendar</code> being used by this object.
 | |
|     *
 | |
|     * @see java.util.Calendar
 | |
|     */
 | |
|   public Calendar getCalendar ()
 | |
|   {
 | |
|     return calendar;
 | |
|   }
 | |
| 
 | |
|   private static DateFormat computeInstance (int style, Locale loc,
 | |
|                                              boolean use_date, boolean use_time)
 | |
|   {
 | |
|     return computeInstance (style, style, loc, use_date, use_time);
 | |
|   }
 | |
| 
 | |
|   private static DateFormat computeInstance (int dateStyle, int timeStyle,
 | |
|                                              Locale loc, boolean use_date,
 | |
|                                              boolean use_time)
 | |
|   {
 | |
|     ResourceBundle res;
 | |
|     try
 | |
|       {
 | |
| 	res = ResourceBundle.getBundle("gnu.java.locale.LocaleInformation",
 | |
| 				       loc, ClassLoader.getSystemClassLoader());
 | |
|       }
 | |
|     catch (MissingResourceException x)
 | |
|       {
 | |
| 	res = null;
 | |
|       }
 | |
| 
 | |
|     String pattern = null;
 | |
|     if (use_date)
 | |
|       {
 | |
| 	String name, def;
 | |
| 	switch (dateStyle)
 | |
| 	  {
 | |
| 	  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 (timeStyle)
 | |
| 	  {
 | |
| 	  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);
 | |
|   }
 | |
| 
 | |
|  /**
 | |
|    * This method returns an instance of <code>DateFormat</code> that will
 | |
|    * format using the default formatting style for dates.
 | |
|    *
 | |
|    * @return A new <code>DateFormat</code> instance.
 | |
|    */
 | |
|   public static final DateFormat getDateInstance ()
 | |
|   {
 | |
|     return getDateInstance (DEFAULT, Locale.getDefault());
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns an instance of <code>DateFormat</code> that will
 | |
|    * format using the specified formatting style for dates.
 | |
|    *
 | |
|    * @param style The type of formatting to perform. 
 | |
|    * 
 | |
|    * @return A new <code>DateFormat</code> instance.
 | |
|    */
 | |
|   public static final DateFormat getDateInstance (int style)
 | |
|   {
 | |
|     return getDateInstance (style, Locale.getDefault());
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns an instance of <code>DateFormat</code> that will
 | |
|    * format using the specified formatting style for dates.  The specified
 | |
|    * localed will be used in place of the default.
 | |
|    *
 | |
|    * @param style The type of formatting to perform. 
 | |
|    * @param loc The desired locale.
 | |
|    * 
 | |
|    * @return A new <code>DateFormat</code> instance.
 | |
|    */
 | |
|   public static final DateFormat getDateInstance (int style, Locale loc)
 | |
|   {
 | |
|     return computeInstance (style, loc, true, false);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns a new instance of <code>DateFormat</code> that
 | |
|    * formats both dates and times using the <code>SHORT</code> style.
 | |
|    *
 | |
|    * @return A new <code>DateFormat</code>instance.
 | |
|    */
 | |
|   public static final DateFormat getDateTimeInstance ()
 | |
|   {
 | |
|     return getDateTimeInstance (DEFAULT, DEFAULT, Locale.getDefault());
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns a new instance of <code>DateFormat</code> that
 | |
|    * formats both dates and times using the <code>DEFAULT</code> style.
 | |
|    *
 | |
|    * @return A new <code>DateFormat</code>instance.
 | |
|    */
 | |
|   public static final DateFormat getDateTimeInstance (int dateStyle, 
 | |
| 						      int timeStyle)
 | |
|   {
 | |
|     return getDateTimeInstance (dateStyle, timeStyle, Locale.getDefault());
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns a new instance of <code>DateFormat</code> that
 | |
|    * formats both dates and times using the specified styles.
 | |
|    * 
 | |
|    * @param dateStyle The desired style for date formatting.
 | |
|    * @param timeStyle The desired style for time formatting
 | |
|    *
 | |
|    * @return A new <code>DateFormat</code>instance.
 | |
|    */
 | |
|   public static final DateFormat getDateTimeInstance (int dateStyle, 
 | |
| 						      int timeStyle, 
 | |
| 						      Locale loc)
 | |
|   {
 | |
|     return computeInstance (dateStyle, timeStyle, loc, true, true);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns a new instance of <code>DateFormat</code> that
 | |
|    * formats both dates and times using the <code>SHORT</code> style.
 | |
|    *
 | |
|    * @return A new <code>DateFormat</code>instance.
 | |
|    */
 | |
|   public static final DateFormat getInstance ()
 | |
|   {
 | |
|     // JCL book says SHORT.
 | |
|     return getDateTimeInstance (SHORT, SHORT, Locale.getDefault());
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns the <code>NumberFormat</code> object being used
 | |
|    * by this object to parse/format time values.
 | |
|    *
 | |
|    * @return The <code>NumberFormat</code> in use by this object.
 | |
|    */
 | |
|   public NumberFormat getNumberFormat ()
 | |
|   {
 | |
|     return numberFormat;
 | |
|   }
 | |
| 
 | |
|  /**
 | |
|    * This method returns an instance of <code>DateFormat</code> that will
 | |
|    * format using the default formatting style for times.
 | |
|    *
 | |
|    * @return A new <code>DateFormat</code> instance.
 | |
|    */
 | |
|   public static final DateFormat getTimeInstance ()
 | |
|   {
 | |
|     return getTimeInstance (DEFAULT, Locale.getDefault());
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns an instance of <code>DateFormat</code> that will
 | |
|    * format using the specified formatting style for times.
 | |
|    *
 | |
|    * @param style The type of formatting to perform. 
 | |
|    * 
 | |
|    * @return A new <code>DateFormat</code> instance.
 | |
|    */
 | |
|   public static final DateFormat getTimeInstance (int style)
 | |
|   {
 | |
|     return getTimeInstance (style, Locale.getDefault());
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns an instance of <code>DateFormat</code> that will
 | |
|    * format using the specified formatting style for times.  The specified
 | |
|    * localed will be used in place of the default.
 | |
|    *
 | |
|    * @param style The type of formatting to perform. 
 | |
|    * @param loc The desired locale.
 | |
|    * 
 | |
|    * @return A new <code>DateFormat</code> instance.
 | |
|    */
 | |
|   public static final DateFormat getTimeInstance (int style, Locale loc)
 | |
|   {
 | |
|     return computeInstance (style, loc, false, true);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns the <code>TimeZone</code> object being used by
 | |
|    * this instance.
 | |
|    *
 | |
|    * @return The time zone in use.
 | |
|    */
 | |
|   public TimeZone getTimeZone ()
 | |
|   {
 | |
|     return calendar.getTimeZone();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns a hash value for this object.
 | |
|    * 
 | |
|    * @return A hash value for this object.
 | |
|    */
 | |
|   public int hashCode ()
 | |
|   {
 | |
|     if (numberFormat != null)
 | |
|       return numberFormat.hashCode();
 | |
|     else
 | |
|       return 0;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method indicates whether or not the parsing of date and time
 | |
|    * values should be done in a lenient value.
 | |
|    *
 | |
|    * @return <code>true</code> if date/time parsing is lenient,
 | |
|    * <code>false</code> otherwise.
 | |
|    */
 | |
|   public boolean isLenient ()
 | |
|   {
 | |
|     return calendar.isLenient();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method parses the specified date/time string.
 | |
|    *
 | |
|    * @param source The string to parse.
 | |
|    * @return The resultant date.
 | |
|    *
 | |
|    * @exception ParseException If the specified string cannot be parsed.
 | |
|    */
 | |
|   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 in \""
 | |
| 				 + source + '\"', index);
 | |
|       }
 | |
|     return result;
 | |
|   }
 | |
| 
 | |
|   /** 
 | |
|    * This method parses the specified <code>String</code> into a 
 | |
|    * <code>Date</code>.  The <code>pos</code> argument contains the
 | |
|    * starting parse position on method entry and the ending parse
 | |
|    * position on method exit.
 | |
|    *
 | |
|    * @param source The string to parse.
 | |
|    * @param pos The starting parse position in entry, the ending parse
 | |
|    * position on exit.
 | |
|    *
 | |
|    * @return The parsed date, or <code>null</code> if the string cannot
 | |
|    * be parsed.
 | |
|    */
 | |
|   public abstract Date parse (String source, ParsePosition pos);
 | |
| 
 | |
|   /**
 | |
|    * This method is identical to <code>parse(String, ParsePosition)</code>,
 | |
|    * but returns its result as an <code>Object</code> instead of a
 | |
|    * <code>Date</code>.
 | |
|    * 
 | |
|    * @param source The string to parse.
 | |
|    * @param pos The starting parse position in entry, the ending parse
 | |
|    * position on exit.
 | |
|    *
 | |
|    * @return The parsed date, or <code>null</code> if the string cannot
 | |
|    * be parsed.
 | |
|    */
 | |
|   public Object parseObject (String source, ParsePosition pos)
 | |
|   {
 | |
|     return parse(source, pos);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method specified the <code>Calendar</code> that should be used 
 | |
|    * by this object to parse/format datetimes.
 | |
|    *
 | |
|    * @param calendar The new <code>Calendar</code> for this object.
 | |
|    *
 | |
|    * @see java.util.Calendar
 | |
|    */
 | |
|   public void setCalendar (Calendar calendar)
 | |
|   {
 | |
|     this.calendar = calendar;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method specifies whether or not this object should be lenient in 
 | |
|    * the syntax it accepts while parsing date/time values.
 | |
|    *
 | |
|    * @param lenient <code>true</code> if parsing should be lenient,
 | |
|    * <code>false</code> otherwise.
 | |
|    */
 | |
|   public void setLenient (boolean lenient)
 | |
|   {
 | |
|     calendar.setLenient(lenient);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method specifies the <code>NumberFormat</code> object that should
 | |
|    * be used by this object to parse/format times.
 | |
|    *
 | |
|    * @param numberFormat The <code>NumberFormat</code> in use by this object.
 | |
|    */
 | |
|   public void setNumberFormat (NumberFormat numberFormat)
 | |
|   {
 | |
|     this.numberFormat = numberFormat;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method sets the time zone that should be used by this object.
 | |
|    *
 | |
|    * @param timeZone The new time zone.
 | |
|    */
 | |
|   public void setTimeZone (TimeZone timeZone)
 | |
|   {
 | |
|     calendar.setTimeZone(timeZone);
 | |
|   }
 | |
| }
 |