/* java.util.Date
   Copyright (C) 1998, 1999, 2000, 2001, 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.util;

import gnu.java.lang.CPStringBuilder;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

/**
 * <p>
 * This class represents a specific time in milliseconds since the epoch.
 * The epoch is 1970, January 1 00:00:00.0000 UTC.
 * </p>
 * <p>
 * <code>Date</code> is intended to reflect universal time coordinate (UTC),
 * but this depends on the underlying host environment.  Most operating systems
 * don't handle the leap second, which occurs about once every year or
 * so.  The leap second is added to the last minute of the day on either
 * the 30th of June or the 31st of December, creating a minute 61 seconds
 * in length.
 * </p>
 * <p>
 * The representations of the date fields are as follows:
 * <ul>
 * <li>
 * Years are specified as the difference between the year
 * and 1900.  Thus, the final year used is equal to
 * 1900 + y, where y is the input value.
 * </li>
 * <li>
 * Months are represented using zero-based indexing,
 * making 0 January and 11 December.
 * </li>
 * <li>
 * Dates are represented with the usual values of
 * 1 through to 31.
 * </li>
 * <li>
 * Hours are represented in the twenty-four hour clock,
 * with integer values from 0 to 23.  12am is 0, and
 * 12pm is 12.
 * </li>
 * <li>
 * Minutes are again as usual, with values from 0 to 59.
 * </li>
 * <li>
 * Seconds are represented with the values 0 through to 61,
 * with 60 and 61 being leap seconds (as per the ISO C standard).
 * </li>
 * </ul>
 * </p>
 * <p>
 * Prior to JDK 1.1, this class was the sole class handling date and time
 * related functionality.  However, this particular solution was not
 * amenable to internationalization.  The new <code>Calendar</code>
 * class should now be used to handle dates and times, with <code>Date</code>
 * being used only for values in milliseconds since the epoch.  The
 * <code>Calendar</code> class, and its concrete implementations, handle
 * the interpretation of these values into minutes, hours, days, months
 * and years.  The formatting and parsing of dates is left to the
 * <code>DateFormat</code> class, which is able to handle the different
 * types of date format which occur in different locales.
 * </p>
 *
 * @see Calendar
 * @see GregorianCalendar
 * @see java.text.DateFormat
 * @author Jochen Hoenicke
 * @author Per Bothner (bothner@cygnus.com)
 * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
 */
public class Date
    implements Cloneable, Comparable<Date>, Serializable
{
  /**
   * This is the serialization UID for this class
   * for compatability with Sun's JDK.
   */
  private static final long serialVersionUID = 7523967970034938905L;

  /**
   * The time in milliseconds since the epoch.
   */
  private transient long time;

  /**
   * An array of week names used to map names to integer values.
   */
  private static final String[] weekNames = { "Sun", "Mon", "Tue", "Wed",
                                              "Thu", "Fri", "Sat" };
  /**
   * An array of month names used to map names to integer values.
   */
  private static final String[] monthNames = { "Jan", "Feb", "Mar", "Apr",
                                               "May", "Jun", "Jul", "Aug",
                                               "Sep", "Oct", "Nov", "Dec" };
  /**
   * Creates a new Date Object representing the current time.
   */
  public Date()
  {
    time = System.currentTimeMillis();
  }

  /**
   * Creates a new Date Object representing the given time.
   *
   * @param time the time in milliseconds since the epoch.
   */
  public Date(long time)
  {
    this.time = time;
  }

  /**
   * Creates a new Date Object representing the given time.
   *
   * @deprecated use <code>new GregorianCalendar(year+1900, month,
   * day)</code> instead.
   * @param year the difference between the required year and 1900.
   * @param month the month as a value between 0 and 11.
   * @param day the day as a value between 0 and 31.
   */
  public Date(int year, int month, int day)
  {
    this(year, month, day, 0, 0, 0);
  }

  /**
   * Creates a new Date Object representing the given time.
   *
   * @deprecated use <code>new GregorianCalendar(year+1900, month,
   * day, hour, min)</code> instead.
   * @param year the difference between the required year and 1900.
   * @param month the month as a value between 0 and 11.
   * @param day the day as a value between 0 and 31.
   * @param hour the hour as a value between 0 and 23, in 24-hour
   *        clock notation.
   * @param min the minute as a value between 0 and 59.
   */
  public Date(int year, int month, int day, int hour, int min)
  {
    this(year, month, day, hour, min, 0);
  }

  /**
   * Creates a new Date Object representing the given time.
   *
   * @deprecated use <code>new GregorianCalendar(year+1900, month,
   * day, hour, min, sec)</code> instead.
   * @param year the difference between the required year and 1900.
   * @param month the month as a value between 0 and 11.
   * @param day the day as a value between 0 and 31.
   * @param hour the hour as a value between 0 and 23, in 24-hour
   *        clock notation.
   * @param min the minute as a value between 0 and 59.
   * @param sec the second as a value between 0 and 61 (with 60
   *        and 61 being leap seconds).
   */
  public Date(int year, int month, int day, int hour, int min, int sec)
  {
    GregorianCalendar cal =
        new GregorianCalendar(year + 1900, month, day, hour, min, sec);
    time = cal.getTimeInMillis();
  }

  /**
   * Creates a new Date from the given string representation.  This
   * does the same as <code>new Date(Date.parse(s))</code>
   * @see #parse
   * @deprecated use <code>java.text.DateFormat.parse(s)</code> instead.
   */
  public Date(String s)
  {
    time = parse(s);
  }

  /**
   * Returns a copy of this <code>Date</code> object.
   *
   * @return a copy, or null if the object couldn't be
   *         cloned.
   * @see Object#clone()
   */
  public Object clone()
  {
    try
      {
        return super.clone();
      }
    catch (CloneNotSupportedException ex)
      {
        return null;
      }
  }

  /**
   * Returns the number of milliseconds since the epoch
   * specified by the given arguments.  The arguments are
   * interpreted relative to UTC rather than the local
   * time zone.
   *
   * @deprecated Use <code>Calendar</code> with a UTC
   *             <code>TimeZone</code> instead.
   * @param year the difference between the required year and 1900.
   * @param month the month as a value between 0 and 11.
   * @param date the day as a value between 0 and 31.
   * @param hrs the hour as a value between 0 and 23, in 24-hour
   *        clock notation.
   * @param min the minute as a value between 0 and 59.
   * @param sec the second as a value between 0 and 61 (with 60
   *        and 61 being leap seconds).
   * @return the time in milliseconds since the epoch.
   */
  public static long UTC(int year, int month, int date,
                         int hrs, int min, int sec)
  {
    GregorianCalendar cal =
      new GregorianCalendar(year + 1900, month, date, hrs, min, sec);
    cal.set(Calendar.ZONE_OFFSET, 0);
    cal.set(Calendar.DST_OFFSET, 0);
    return cal.getTimeInMillis();
  }

  /**
   * Gets the time represented by this object.
   *
   * @return the time in milliseconds since the epoch.
   */
  public long getTime()
  {
    return time;
  }

  /**
   * Returns the number of minutes offset used with UTC to give the time
   * represented by this object in the current time zone.  The date information
   * from this object is also used to determine whether or not daylight savings
   * time is in effect.  For example, the offset for the UK would be 0 if the
   * month of the date object was January, and 1 if the month was August.
   *
   * @deprecated use
   * <code>Calendar.get(Calendar.ZONE_OFFSET)+Calendar.get(Calendar.DST_OFFSET)</code>
   * instead.
   * @return The time zone offset in minutes of the local time zone
   * relative to UTC.  The time represented by this object is used to
   * determine if we should use daylight savings.
   */
  public int getTimezoneOffset()
  {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(time);
    return - (cal.get(Calendar.ZONE_OFFSET)
            + cal.get(Calendar.DST_OFFSET)) / (60 * 1000);
  }

  /**
   * Sets the time which this object should represent.
   *
   * @param time the time in milliseconds since the epoch.
   */
  public void setTime(long time)
  {
    this.time = time;
  }

  /**
   * Tests if this date is after the specified date.
   *
   * @param when the other date
   * @return true, if the date represented by this object is
   * strictly later than the time represented by when.
   */
  public boolean after(Date when)
  {
    return time > when.time;
  }

  /**
   * Tests if this date is before the specified date.
   *
   * @param when the other date
   * @return true, if the date represented by when is strictly later
   * than the time represented by this object.
   */
  public boolean before(Date when)
  {
    return time < when.time;
  }

  /**
   * Compares two dates for equality.
   *
   * @param obj the object to compare.
   * @return true, if obj is a Date object and the time represented
   * by obj is exactly the same as the time represented by this
   * object.
   */
  public boolean equals(Object obj)
  {
    return (obj instanceof Date && time == ((Date) obj).time);
  }

  /**
   * Compares two dates.
   *
   * @param when the other date.
   * @return 0, if the date represented
   * by obj is exactly the same as the time represented by this
   * object, a negative if this Date is before the other Date, and
   * a positive value otherwise.
   */
  public int compareTo(Date when)
  {
    return (time < when.time) ? -1 : (time == when.time) ? 0 : 1;
  }

  /**
   * Computes the hash code of this <code>Date</code> as the
   * XOR of the most significant and the least significant
   * 32 bits of the 64 bit milliseconds value.
   *
   * @return the hash code.
   */
  public int hashCode()
  {
    return (int) time ^ (int) (time >>> 32);
  }

  /**
   * <p>
   * Returns a string representation of this date using
   * the following date format:
   * </p>
   * <p>
   * <code>day mon dd hh:mm:ss zz yyyy</code>
   * </p>
   * <p>where the fields used here are:
   * <ul>
   * <li>
   * <code>day</code> -- the day of the week
   * (Sunday through to Saturday).
   * </li>
   * <li>
   * <code>mon</code> -- the month (Jan to Dec).
   * </li>
   * <li>
   * <code>dd</code> -- the day of the month
   * as two decimal digits (01 to 31).
   * </li>
   * <li>
   * <code>hh</code> -- the hour of the day
   * as two decimal digits in 24-hour clock notation
   * (01 to 23).
   * </li>
   * <li>
   * <code>mm</code> -- the minute of the day
   * as two decimal digits (01 to 59).
   * </li>
   * <li>
   * <code>ss</code> -- the second of the day
   * as two decimal digits (01 to 61).
   * </li>
   * <li>
   * <code>zz</code> -- the time zone information if available.
   * The possible time zones used include the abbreviations
   * recognised by <code>parse()</code> (e.g. GMT, CET, etc.)
   * and may reflect the fact that daylight savings time is in
   * effect.  The empty string is used if there is no time zone
   * information.
   * </li>
   * <li>
   * <code>yyyy</code> -- the year as four decimal digits.
   * </li>
   * </ul>
   * <p>
   * The <code>DateFormat</code> class should now be
   * preferred over using this method.
   * </p>
   *
   * @return A string of the form 'day mon dd hh:mm:ss zz yyyy'
   * @see #parse(String)
   * @see DateFormat
   */
  public String toString()
  {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(time);
    String day = "0" + cal.get(Calendar.DATE);
    String hour = "0" + cal.get(Calendar.HOUR_OF_DAY);
    String min = "0" + cal.get(Calendar.MINUTE);
    String sec = "0" + cal.get(Calendar.SECOND);
    String year = "000" + cal.get(Calendar.YEAR);
    return weekNames[cal.get(Calendar.DAY_OF_WEEK) - 1] + " "
      + monthNames[cal.get(Calendar.MONTH)] + " "
      + day.substring(day.length() - 2) + " "
      + hour.substring(hour.length() - 2) + ":"
      + min.substring(min.length() - 2) + ":"
      + sec.substring(sec.length() - 2) + " "
      +
      cal.getTimeZone().getDisplayName(cal.getTimeZone().inDaylightTime(this),
                                       TimeZone.SHORT) + " " +
      year.substring(year.length() - 4);
  }

  /**
   * Returns a locale-dependent string representation of this
   * <code>Date</code> object.
   *
   * @deprecated Use DateFormat.format(Date)
   * @return A locale-dependent string representation.
   * @see #parse(String)
   * @see DateFormat
   */
  public String toLocaleString()
  {
    return java.text.DateFormat.getInstance().format(this);
  }

  /**
   * <p>
   * Returns a string representation of this <code>Date</code>
   * object using GMT rather than the local timezone.
   * The following date format is used:
   * </p>
   * <p>
   * <code>d mon yyyy hh:mm:ss GMT</code>
   * </p>
   * <p>where the fields used here are:
   * <ul>
   * <li>
   * <code>d</code> -- the day of the month
   * as one or two decimal digits (1 to 31).
   * </li>
   * <li>
   * <code>mon</code> -- the month (Jan to Dec).
   * </li>
   * <li>
   * <code>yyyy</code> -- the year as four decimal digits.
   * </li>
   * <li>
   * <code>hh</code> -- the hour of the day
   * as two decimal digits in 24-hour clock notation
   * (01 to 23).
   * </li>
   * <li>
   * <code>mm</code> -- the minute of the day
   * as two decimal digits (01 to 59).
   * </li>
   * <li>
   * <code>ss</code> -- the second of the day
   * as two decimal digits (01 to 61).
   * </li>
   * <li>
   * <code>GMT</code> -- the literal string "GMT"
   * indicating Greenwich Mean Time as opposed to
   * the local timezone.
   * </li>
   * </ul>
   *
   * @deprecated Use DateFormat.format(Date) with a GMT TimeZone.
   * @return A string of the form 'd mon yyyy hh:mm:ss GMT' using
   *         GMT as opposed to the local timezone.
   * @see #parse(String)
   * @see DateFormat
   */
  public String toGMTString()
  {
    java.text.DateFormat format = java.text.DateFormat.getInstance();
    format.setTimeZone(TimeZone.getTimeZone("GMT"));
    return format.format(this);
  }

  /**
   * Parses the time zone string.
   *
   * @param tok The token containing the time zone.
   * @param sign The sign (+ or -) used by the time zone.
   * @return An integer representing the number of minutes offset
   *         from GMT for the time zone.
   */
  private static int parseTz(String tok, char sign)
    throws IllegalArgumentException
  {
    int num;

    try
      {
        // parseInt doesn't handle '+' so strip off sign.
        num = Integer.parseInt(tok.substring(1));
      }
    catch (NumberFormatException ex)
      {
        throw new IllegalArgumentException(tok);
      }

    // Convert hours to minutes.
    if (num < 24)
      num *= 60;
    else
      num = (num / 100) * 60 + num % 100;

    return sign == '-' ? -num : num;
  }

  /**
   * Parses the month string.
   *
   * @param tok the token containing the month.
   * @return An integer between 0 and 11, representing
   *         a month from January (0) to December (11),
   *         or -1 if parsing failed.
   */
  private static int parseMonth(String tok)
  {
    // Initialize strings for month names.
    // We could possibly use the fields of DateFormatSymbols but that is
    // localized and thus might not match the English words specified.
    String months[] = { "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY",
                        "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER",
                        "NOVEMBER", "DECEMBER" };

    int i;
    for (i = 0; i < 12; i++)
      if (months[i].startsWith(tok))
        return i;

    // Return -1 if not found.
    return -1;
  }

  /**
   * Parses the day of the week string.
   *
   * @param tok the token containing the day of the week.
   * @return true if the token was parsed successfully.
   */
  private static boolean parseDayOfWeek(String tok)
  {
    // Initialize strings for days of the week names.
    // We could possibly use the fields of DateFormatSymbols but that is
    // localized and thus might not match the English words specified.
    String daysOfWeek[] = { "SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY",
                            "THURSDAY", "FRIDAY", "SATURDAY" };

    int i;
    for (i = 0; i < 7; i++)
      if (daysOfWeek[i].startsWith(tok))
        return true;

    return false;
  }

  /**
   * <p>
   * Parses a String and returns the time, in milliseconds since the
   * epoch, it represents.  Most syntaxes are handled, including
   * the IETF date standard "day, dd mon yyyy hh:mm:ss zz" (see
   * <code>toString()</code> for definitions of these fields).
   * Standard U.S. time zone abbreviations are recognised, in
   * addition to time zone offsets in positive or negative minutes.
   * If a time zone is specified, the specified time is assumed to
   * be in UTC and the appropriate conversion is applied, following
   * parsing, to convert this to the local time zone.  If no zone
   * is specified, the time is assumed to already be in the local
   * time zone.
   * </p>
   * <p>
   * The method parses the string progressively from left to right.
   * At the end of the parsing process, either a time is returned
   * or an <code>IllegalArgumentException</code> is thrown to signify
   * failure.  The ASCII characters A-Z, a-z, 0-9, and ',', '+', '-',
   * ':' and '/' are the only characters permitted within the string,
   * besides whitespace and characters enclosed within parantheses
   * '(' and ')'.
   * </p>
   * <p>
   * A sequence of consecutive digits are recognised as a number,
   * and interpreted as follows:
   * <ul>
   * <li>
   * A number preceded by a sign (+ or -) is taken to be a time zone
   * offset.  The time zone offset can be specified in either hours
   * or minutes.  The former is assumed if the number is less than 24.
   * Otherwise, the offset is assumed to be in minutes.  A - indicates
   * a time zone west of GMT, while a + represents a time zone to the
   * east of GMT.  The time zones are always assumed to be relative
   * to GMT, and a (redundant) specification of this can be included
   * with the time zone.  For example, '-9', 'utc-9' and 'GMT-9' all
   * represent a time zone nine hours west of GMT.  Similarly,
   * '+4', 'ut+4' and 'UTC+4' all give 4 hours east of GMT.
   * </li>
   * <li>
   * A number equal to or greater than 70 is regarded as a year specification.
   * Values lower than 70 are only assumed to indicate a year if both the
   * day of the month and the month itself have already been recognised.
   * Year values less than 100 are interpreted as being relative to the current
   * century when the <code>Date</code> class is initialised..  Given a century,
   * x, the year is assumed to be within the range x - 80 to x + 19.  The value
   * itself is then used as a match against the two last digits of one of these
   * years.  For example, take x to be 2004.  A two-digit year is assumed to fall
   * within the range x - 80 (1924) and x + 19 (2023).  Thus, any intepreted value
   * between 0 and 23 is assumed to be 2000 to 2023 and values between 24 and 99
   * are taken as being 1924 to 1999.  This only applies for the case of 2004.
   * With a different year, the values will be interpreted differently. 2005
   * will used 0 to 24 as 2000 to 2024 and 25 to 99 as 1925 to 1999, for example.
   * This behaviour differs from that of <code>SimpleDateFormat</code> and is
   * time-dependent (a two-digit year will be interpreted differently depending
   * on the time the code is run).
   * </li>
   * <li>
   * Numbers followed by a colon are interpreted by first an hour, and then
   * as a minute, once an hour has been found.
   * </li>
   * <li>
   * <li>
   * Numbers followed by a slash are regarded first as a month, and then as
   * a day of the month once the month has been found.  This follows the
   * U.S. date format of mm/dd, rather than the European dd/mm.  Months
   * are converted to the recognised value - 1 before storage, in order
   * to put the number within the range 0 to 11.
   * </li>
   * <li>
   * Numbers followed by commas, whitespace, hyphens or the end of the string
   * are interpreted in the following order: hour, minute, second, day of month.
   * The first type not already recognised in the current string being parsed is
   * assumed.
   * </li>
   * </ul>
   * </p>
   * <p>
   * A sequence of consecutive alphabetic characters is recognised as a word,
   * and interpreted as follows, in a case-insentive fashion:
   * <ul>
   * <li>
   * The characters 'AM' or 'PM' restrict the hour value to a value between 0
   * and 12.  In the latter case, 12 is added to the hour value before storage.
   * </li>
   * <li>
   * Any words which match any prefix of one of the days of the week ('Monday',
   * 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' and 'Sunday'),
   * are simply ignored.
   * </li>
   * <li>
   * Any words which match any prefix of one of the months of the year ('January',
   * 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September',
   * 'October', 'November', 'December') are recognised and interpreted as the
   * appropriate value between 0 and 11.  The first match made against a
   * month is the one used, in the order specified here.  For example, 'Ma' is
   * intepreted as 'March' (2) and not as 'May' (4).  Similarly, 'Ju' is 'June',
   * and not 'July'.
   * </li>
   * <li>
   * The words 'GMT', 'UT' and 'UTC' are interpreted as specifying UTC as the
   * time zone in use for this date.
   * </li>
   * <li>
   * The word pairs 'EST'/'EDT', 'CST'/'CDT', 'MST'/'MDT' and 'PST'/'PDT' are
   * interpreted as the appropriate U.S. time zone abbreviation.  Each pair
   * is the standard and daylight savings time zone specification, respectively,
   * for each zone within the U.S, these being Eastern Standard/Daylight Time
   * (-5), Central Standard/Daylight Time (-6), Mountain Standard/Daylight Time
   * (-7) and Pacific Standard/Daylight Time (-8).
   * </li>
   * </ul>
   *
   * @param string The String to parse.
   * @return The time in milliseconds since the epoch.
   * @throws IllegalArgumentException if the string fails to parse.
   * @deprecated Use DateFormat.parse(String)
   * @see #toString()
   * @see SimpleDateFormat
   */
  public static long parse(String string)
  {
    // Initialize date/time fields before parsing begins.
    int year = -1;
    int month = -1;
    int day = -1;
    int hour = -1;
    int minute = -1;
    int second = -1;
    int timezone = 0;
    boolean localTimezone = true;

    // Trim out any nested stuff in parentheses now to make parsing easier.
    CPStringBuilder buf = new CPStringBuilder();
    int parenNesting = 0;
    int len = string.length();
    for (int i = 0;  i < len;  i++)
      {
        char ch = string.charAt(i);
        if (ch >= 'a' && ch <= 'z')
          ch -= 'a' - 'A';
        if (ch == '(')
          parenNesting++;
        else if (parenNesting == 0)
          buf.append(ch);
        else if (ch == ')')
          parenNesting--;
      }
    int tmpMonth;

    // Make all chars upper case to simplify comparisons later.
    // Also ignore commas; treat them as delimiters.
    StringTokenizer strtok = new StringTokenizer(buf.toString(), " \t\n\r,");

    while (strtok.hasMoreTokens())
      {
        String tok = strtok.nextToken();
        char firstch = tok.charAt(0);
        if ((firstch == '+' || firstch == '-') && year >= 0)
          {
            timezone = parseTz(tok, firstch);
            localTimezone = false;
          }
        else if (firstch >= '0' && firstch <= '9')
          {
            int lastPunct = -1;
            while (tok != null && tok.length() > 0)
              {
                int punctOffset = tok.length();
                int num = 0;
                int punct;
                for (int i = 0;  ;  i++)
                  {
                    if (i >= punctOffset)
                      {
                        punct = -1;
                        break;
                      }
                    else
                      {
                        punct = tok.charAt(i);
                        if (punct >= '0' && punct <= '9')
                          {
                            if (num > 999999999) // in case of overflow
                              throw new IllegalArgumentException(tok);
                            num = 10 * num + (punct - '0');
                          }
                        else
                          {
                            punctOffset = i;
                            break;
                          }
                      }

                  }

                if (punct == ':')
                  {
                    if (hour < 0)
                      hour = num;
                    else
                      minute = num;
                  }
                else if (lastPunct == ':' && hour >= 0 && (minute < 0 || second < 0))
                  {
                    if (minute < 0)
                      minute = num;
                    else
                      second = num;
                  }
                else if ((num >= 70
                          && (punct == ' ' || punct == ','
                              || punct == '/' || punct < 0))
                         || (num < 70 && day >= 0 && month >= 0 && year < 0))
                  {
                    if (num >= 100)
                      year = num;
                    else
                      {
                        int curYear = 1900 + new Date().getYear();
                        int firstYear = curYear - 80;
                        year = firstYear / 100 * 100 + num;
                        if (year < firstYear)
                          year += 100;
                      }
                  }
                else if (punct == '/')
                  {
                    if (month < 0)
                      month = num - 1;
                    else
                      day = num;
                  }
                else if (hour >= 0 && minute < 0)
                  minute = num;
                else if (minute >= 0 && second < 0)
                  second = num;
                else if (day < 0)
                  day = num;
                else
                  throw new IllegalArgumentException(tok);

                // Advance string if there's more to process in this token.
                if (punct < 0 || punctOffset + 1 >= tok.length())
                  tok = null;
                else
                  tok = tok.substring(punctOffset + 1);
                lastPunct = punct;
              }
          }
        else if (firstch >= 'A' && firstch <= 'Z')
          {
            if (tok.equals("AM"))
              {
                if (hour < 1 || hour > 12)
                  throw new IllegalArgumentException(tok);
                if (hour == 12)
                  hour = 0;
              }
            else if (tok.equals("PM"))
              {
                if (hour < 1 || hour > 12)
                  throw new IllegalArgumentException(tok);
                if (hour < 12)
                  hour += 12;
              }
            else if (parseDayOfWeek(tok))
              { /* Ignore it; throw the token away. */ }
            else if (tok.equals("UT") || tok.equals("UTC") || tok.equals("GMT"))
              localTimezone = false;
            else if (tok.startsWith("UT") || tok.startsWith("GMT"))
              {
                int signOffset = 3;
                if (tok.charAt(1) == 'T' && tok.charAt(2) != 'C')
                  signOffset = 2;

                char sign = tok.charAt(signOffset);
                if (sign != '+' && sign != '-')
                  throw new IllegalArgumentException(tok);

                timezone = parseTz(tok.substring(signOffset), sign);
                localTimezone = false;
              }
            else if ((tmpMonth = parseMonth(tok)) >= 0)
              month = tmpMonth;
            else if (tok.length() == 3 && tok.charAt(2) == 'T')
              {
                // Convert timezone offset from hours to minutes.
                char ch = tok.charAt(0);
                if (ch == 'E')
                  timezone = -5 * 60;
                else if (ch == 'C')
                  timezone = -6 * 60;
                else if (ch == 'M')
                  timezone = -7 * 60;
                else if (ch == 'P')
                  timezone = -8 * 60;
                else
                  throw new IllegalArgumentException(tok);

                // Shift 60 minutes for Daylight Savings Time.
                if (tok.charAt(1) == 'D')
                  timezone += 60;
                else if (tok.charAt(1) != 'S')
                  throw new IllegalArgumentException(tok);

                localTimezone = false;
              }
            else
              throw new IllegalArgumentException(tok);
          }
        else
          throw new IllegalArgumentException(tok);
      }

    // Unspecified hours, minutes, or seconds should default to 0.
    if (hour < 0)
      hour = 0;
    if (minute < 0)
      minute = 0;
    if (second < 0)
      second = 0;

    // Throw exception if any other fields have not been recognized and set.
    if (year < 0 || month < 0 || day < 0)
      throw new IllegalArgumentException("Missing field");

    // Return the time in either local time or relative to GMT as parsed.
    // If no time-zone was specified, get the local one (in minutes) and
    // convert to milliseconds before adding to the UTC.
    GregorianCalendar cal
      = new GregorianCalendar(year, month, day, hour, minute, second);
    if (!localTimezone)
      {
        cal.set(Calendar.ZONE_OFFSET, timezone * 60 * 1000);
        cal.set(Calendar.DST_OFFSET, 0);
      }
    return cal.getTimeInMillis();
  }

  /**
   * Returns the difference between the year represented by this
   * <code>Date</code> object and 1900.
   *
   * @return the year minus 1900 represented by this date object.
   * @deprecated Use Calendar instead of Date, and use get(Calendar.YEAR)
   * instead.  Note the 1900 difference in the year.
   * @see Calendar
   * @see #setYear(int)
   */
  public int getYear()
  {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(time);
    return cal.get(Calendar.YEAR) - 1900;
  }

  /**
   * Sets the year to the specified year, plus 1900.  The other
   * fields are only altered as required to match the same date
   * and time in the new year.  Usually, this will mean that
   * the fields are not changed at all, but in the case of
   * a leap day or leap second, the fields will change in
   * relation to the existence of such an event in the new year.
   * For example, if the date specifies February the 29th, 2000,
   * then this will become March the 1st if the year is changed
   * to 2001, as 2001 is not a leap year.  Similarly, a seconds
   * value of 60 or 61 may result in the seconds becoming 0 and
   * the minute increasing by 1, if the new time does not include
   * a leap second.
   *
   * @param year the year minus 1900.
   * @deprecated Use Calendar instead of Date, and use
   * set(Calendar.YEAR, year) instead.  Note about the 1900
   * difference in year.
   * @see #getYear()
   * @see Calendar
   */
  public void setYear(int year)
  {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(time);
    cal.set(Calendar.YEAR, 1900 + year);
    time = cal.getTimeInMillis();
  }

  /**
   * Returns the month represented by this <code>Date</code> object,
   * as a value between 0 (January) and 11 (December).
   *
   * @return the month represented by this date object (zero based).
   * @deprecated Use Calendar instead of Date, and use get(Calendar.MONTH)
   * instead.
   * @see #setMonth(int)
   * @see Calendar
   */
  public int getMonth()
  {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(time);
    return cal.get(Calendar.MONTH);
  }

  /**
   * Sets the month to the given value.  The other
   * fields are only altered as necessary to match
   * the same date and time in the new month.  In most
   * cases, the other fields won't change at all.  However,
   * in the case of a shorter month or a leap second, values
   * may be adjusted.  For example, if the day of the month
   * is currently 31, and the month value is changed from
   * January (0) to September (8), the date will become
   * October the 1st, as September only has 30 days.  Similarly,
   * a seconds value of 60 or 61 (a leap second) may result
   * in the seconds value being reset to 0 and the minutes
   * value being incremented by 1, if the new time does
   * not include a leap second.
   *
   * @param month the month, with a zero-based index
   *        from January.
   * @deprecated Use Calendar instead of Date, and use
   * set(Calendar.MONTH, month) instead.
   * @see #getMonth()
   * @see Calendar
   */
  public void setMonth(int month)
  {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(time);
    cal.set(Calendar.MONTH, month);
    time = cal.getTimeInMillis();
  }

  /**
   * Returns the day of the month of this <code>Date</code>
   * object, as a value between 0 and 31.
   *
   * @return the day of month represented by this date object.
   * @deprecated Use Calendar instead of Date, and use get(Calendar.DATE)
   * instead.
   * @see Calendar
   * @see #setDate(int)
   */
  public int getDate()
  {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(time);
    return cal.get(Calendar.DATE);
  }

  /**
   * Sets the date to the given value. The other
   * fields are only altered as necessary to match
   * the same date and time on the new day of the month.  In most
   * cases, the other fields won't change at all.  However,
   * in the case of a leap second or the day being out of
   * the range of the current month, values
   * may be adjusted.  For example, if the day of the month
   * is currently 30 and the month is June, a new day of the
   * month value of 31 will cause the month to change to July,
   * as June only has 30 days .  Similarly,
   * a seconds value of 60 or 61 (a leap second) may result
   * in the seconds value being reset to 0 and the minutes
   * value being incremented by 1, if the new time does
   * not include a leap second.
   *
   * @param date the date.
   * @deprecated Use Calendar instead of Date, and use
   * set(Calendar.DATE, date) instead.
   * @see Calendar
   * @see #getDate()
   */
  public void setDate(int date)
  {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(time);
    cal.set(Calendar.DATE, date);
    time = cal.getTimeInMillis();
  }

  /**
   * Returns the day represented by this <code>Date</code>
   * object as an integer between 0 (Sunday) and 6 (Saturday).
   *
   * @return the day represented by this date object.
   * @deprecated Use Calendar instead of Date, and use get(Calendar.DAY_OF_WEEK)
   * instead.
   * @see Calendar
   */
  public int getDay()
  {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(time);
    // For Calendar, Sunday is 1.  For Date, Sunday is 0.
    return cal.get(Calendar.DAY_OF_WEEK) - 1;
  }

  /**
   * Returns the hours represented by this <code>Date</code>
   * object as an integer between 0 and 23.
   *
   * @return the hours represented by this date object.
   * @deprecated Use Calendar instead of Date, and use get(Calendar.HOUR_OF_DAY)
   * instead.
   * @see Calendar
   * @see #setHours(int)
   */
  public int getHours()
  {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(time);
    return cal.get(Calendar.HOUR_OF_DAY);
  }

  /**
   * Sets the hours to the given value.  The other
   * fields are only altered as necessary to match
   * the same date and time in the new hour.  In most
   * cases, the other fields won't change at all.  However,
   * in the case of a leap second, values
   * may be adjusted.  For example,
   * a seconds value of 60 or 61 (a leap second) may result
   * in the seconds value being reset to 0 and the minutes
   * value being incremented by 1 if the new hour does
   * not contain a leap second.
   *
   * @param hours the hours.
   * @deprecated Use Calendar instead of Date, and use
   * set(Calendar.HOUR_OF_DAY, hours) instead.
   * @see Calendar
   * @see #getHours()
   */
  public void setHours(int hours)
  {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(time);
    cal.set(Calendar.HOUR_OF_DAY, hours);
    time = cal.getTimeInMillis();
  }

  /**
   * Returns the number of minutes represented by the <code>Date</code>
   * object, as an integer between 0 and 59.
   *
   * @return the minutes represented by this date object.
   * @deprecated Use Calendar instead of Date, and use get(Calendar.MINUTE)
   * instead.
   * @see Calendar
   * @see #setMinutes(int)
   */
  public int getMinutes()
  {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(time);
    return cal.get(Calendar.MINUTE);
  }

  /**
   * Sets the minutes to the given value.  The other
   * fields are only altered as necessary to match
   * the same date and time in the new minute.  In most
   * cases, the other fields won't change at all.  However,
   * in the case of a leap second, values
   * may be adjusted.  For example,
   * a seconds value of 60 or 61 (a leap second) may result
   * in the seconds value being reset to 0 and the minutes
   * value being incremented by 1 if the new minute does
   * not contain a leap second.
   *
   * @param minutes the minutes.
   * @deprecated Use Calendar instead of Date, and use
   * set(Calendar.MINUTE, minutes) instead.
   * @see Calendar
   * @see #getMinutes()
   */
  public void setMinutes(int minutes)
  {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(time);
    cal.set(Calendar.MINUTE, minutes);
    time = cal.getTimeInMillis();
  }

  /**
   * Returns the number of seconds represented by the <code>Date</code>
   * object, as an integer between 0 and 61 (60 and 61 being leap seconds).
   *
   * @return the seconds represented by this date object.
   * @deprecated Use Calendar instead of Date, and use get(Calendar.SECOND)
   * instead.
   * @see Calendar
   * @see #setSeconds(int)
   */
  public int getSeconds()
  {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(time);
    return cal.get(Calendar.SECOND);
  }

  /**
   * Sets the seconds to the given value.  The other
   * fields are only altered as necessary to match
   * the same date and time in the new minute.  In most
   * cases, the other fields won't change at all.  However,
   * in the case of a leap second, values
   * may be adjusted.  For example, setting the
   * seconds value to 60 or 61 (a leap second) may result
   * in the seconds value being reset to 0 and the minutes
   * value being incremented by 1, if the current time does
   * not contain a leap second.
   *
   * @param seconds the seconds.
   * @deprecated Use Calendar instead of Date, and use
   * set(Calendar.SECOND, seconds) instead.
   * @see Calendar
   * @see #getSeconds()
   */
  public void setSeconds(int seconds)
  {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(time);
    cal.set(Calendar.SECOND, seconds);
    time = cal.getTimeInMillis();
  }

  /**
   * Deserializes a <code>Date</code> object from an
   * input stream, setting the time (in milliseconds
   * since the epoch) to the long value read from the
   * stream.
   *
   * @param input the input stream.
   * @throws IOException if an I/O error occurs in the stream.
   * @throws ClassNotFoundException if the class of the
   *         serialized object could not be found.
   */
  private void readObject(ObjectInputStream input)
    throws IOException, ClassNotFoundException
  {
    input.defaultReadObject();
    time = input.readLong();
  }

  /**
   * Serializes a <code>Date</code> object to an output stream,
   * storing the time (in milliseconds since the epoch) as a long
   * value in the stream.
   *
   * @serialdata A long value representing the offset from the epoch
   * in milliseconds.  This is the same value that is returned by the
   * method getTime().
   * @param output the output stream.
   * @throws IOException if an I/O error occurs in the stream.
   */
  private void writeObject(ObjectOutputStream output)
    throws IOException
  {
    output.defaultWriteObject();
    output.writeLong(time);
  }

}
