151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
22c87ad3a45cecf9e344487cad1abfdebe79f2c7cNarayan Kamath * Copyright (C) 2014 The Android Open Source Project
32485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it
751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as
851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation.  Oracle designates this
951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided
1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code.
1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT
1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that
1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code).
1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version
1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation,
2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any
2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions.
2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.util;
2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.text.DateFormat;
302485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thiererimport java.time.LocalDate;
3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.IOException;
3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.ObjectOutputStream;
3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.ObjectInputStream;
3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.lang.ref.SoftReference;
352485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thiererimport java.time.Instant;
3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.util.calendar.BaseCalendar;
3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.util.calendar.CalendarDate;
3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.util.calendar.CalendarSystem;
3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.util.calendar.CalendarUtils;
4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.util.calendar.Era;
4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.util.calendar.Gregorian;
4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/**
4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The class <code>Date</code> represents a specific instant
4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * in time, with millisecond precision.
4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>
4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Prior to JDK&nbsp;1.1, the class <code>Date</code> had two additional
4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * functions.  It allowed the interpretation of dates as year, month, day, hour,
4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * minute, and second values.  It also allowed the formatting and parsing
5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of date strings.  Unfortunately, the API for these functions was not
5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * amenable to internationalization.  As of JDK&nbsp;1.1, the
5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Calendar</code> class should be used to convert between dates and time
5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * fields and the <code>DateFormat</code> class should be used to format and
5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * parse date strings.
5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The corresponding methods in <code>Date</code> are deprecated.
5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>
5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Although the <code>Date</code> class is intended to reflect
5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * coordinated universal time (UTC), it may not do so exactly,
5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * depending on the host environment of the Java Virtual Machine.
6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Nearly all modern operating systems assume that 1&nbsp;day&nbsp;=
6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 24&nbsp;&times;&nbsp;60&nbsp;&times;&nbsp;60&nbsp;= 86400 seconds
6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * in all cases. In UTC, however, about once every year or two there
6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is an extra second, called a "leap second." The leap
6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * second is always added as the last second of the day, and always
6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * on December 31 or June 30. For example, the last minute of the
6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * year 1995 was 61 seconds long, thanks to an added leap second.
6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Most computer clocks are not accurate enough to be able to reflect
6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the leap-second distinction.
6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>
7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Some computer standards are defined in terms of Greenwich mean
7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * time (GMT), which is equivalent to universal time (UT).  GMT is
7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the "civil" name for the standard; UT is the
7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * "scientific" name for the same standard. The
7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * distinction between UTC and UT is that UTC is based on an atomic
7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * clock and UT is based on astronomical observations, which for all
7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * practical purposes is an invisibly fine hair to split. Because the
7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * earth's rotation is not uniform (it slows down and speeds up
7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * in complicated ways), UT does not always flow uniformly. Leap
7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * seconds are introduced as needed into UTC so as to keep UTC within
8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 0.9 seconds of UT1, which is a version of UT with certain
8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * corrections applied. There are other time and date systems as
8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * well; for example, the time scale used by the satellite-based
8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * global positioning system (GPS) is synchronized to UTC but is
8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <i>not</i> adjusted for leap seconds. An interesting source of
8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * further information is the U.S. Naval Observatory, particularly
8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the Directorate of Time at:
8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <blockquote><pre>
8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     <a href=http://tycho.usno.navy.mil>http://tycho.usno.navy.mil</a>
8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre></blockquote>
9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>
9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and their definitions of "Systems of Time" at:
9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <blockquote><pre>
9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     <a href=http://tycho.usno.navy.mil/systime.html>http://tycho.usno.navy.mil/systime.html</a>
9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre></blockquote>
9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>
9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * In all methods of class <code>Date</code> that accept or return
9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * year, month, date, hours, minutes, and seconds values, the
9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * following representations are used:
9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <ul>
10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li>A year <i>y</i> is represented by the integer
10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     <i>y</i>&nbsp;<code>-&nbsp;1900</code>.
10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li>A month is represented by an integer from 0 to 11; 0 is January,
10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     1 is February, and so forth; thus 11 is December.
10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li>A date (day of month) is represented by an integer from 1 to 31
10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     in the usual manner.
10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li>An hour is represented by an integer from 0 to 23. Thus, the hour
10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     from midnight to 1 a.m. is hour 0, and the hour from noon to 1
10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     p.m. is hour 12.
10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li>A minute is represented by an integer from 0 to 59 in the usual manner.
11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li>A second is represented by an integer from 0 to 61; the values 60 and
11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     61 occur only for leap seconds and even then only in Java
11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     implementations that actually track leap seconds correctly. Because
11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     of the manner in which leap seconds are currently introduced, it is
11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     extremely unlikely that two leap seconds will occur in the same
11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     minute, but this specification follows the date and time conventions
11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     for ISO C.
11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </ul>
11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>
11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * In all cases, arguments given to methods for these purposes need
12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * not fall within the indicated ranges; for example, a date may be
12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * specified as January 32 and is interpreted as meaning February 1.
12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author  James Gosling
12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author  Arthur van Hoff
12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author  Alan Liu
12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see     java.text.DateFormat
12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see     java.util.Calendar
12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see     java.util.TimeZone
12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since   JDK1.0
13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class Date
13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    implements java.io.Serializable, Cloneable, Comparable<Date>
13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski{
13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final BaseCalendar gcal =
13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                CalendarSystem.getGregorianCalendar();
13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static BaseCalendar jcal;
13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private transient long fastTime;
13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /*
14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * If cdate is null, then fastTime indicates the time in millis.
14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * If cdate.isNormalized() is true, then fastTime and cdate are in
14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * synch. Otherwise, fastTime is ignored, and cdate indicates the
14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * time.
14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private transient BaseCalendar.Date cdate;
14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // Initialized just before the value is used. See parse().
14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static int defaultCenturyStart;
15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /* use serialVersionUID from modified java.util.Date for
15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * interoperability with JDK1.1. The Date was modified to write
15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * and read only the UTC time.
15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final long serialVersionUID = 7523967970034938905L;
15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Allocates a <code>Date</code> object and initializes it so that
15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * it represents the time at which it was allocated, measured to the
16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * nearest millisecond.
16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.lang.System#currentTimeMillis()
16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Date() {
16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this(System.currentTimeMillis());
16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Allocates a <code>Date</code> object and initializes it to
17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * represent the specified number of milliseconds since the
17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * standard base time known as "the epoch", namely January 1,
17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * 1970, 00:00:00 GMT.
17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   date   the milliseconds since January 1, 1970, 00:00:00 GMT.
17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.lang.System#currentTimeMillis()
17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Date(long date) {
17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        fastTime = date;
17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Allocates a <code>Date</code> object and initializes it so that
18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * it represents midnight, local time, at the beginning of the day
18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * specified by the <code>year</code>, <code>month</code>, and
18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>date</code> arguments.
18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   year    the year minus 1900.
18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   month   the month between 0-11.
18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   date    the day of the month between 1-31.
19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Calendar
19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>Calendar.set(year + 1900, month, date)</code>
19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * or <code>GregorianCalendar(year + 1900, month, date)</code>.
19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Date(int year, int month, int date) {
19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this(year, month, date, 0, 0, 0);
19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Allocates a <code>Date</code> object and initializes it so that
20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * it represents the instant at the start of the minute specified by
20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the <code>year</code>, <code>month</code>, <code>date</code>,
20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>hrs</code>, and <code>min</code> arguments, in the local
20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * time zone.
20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   year    the year minus 1900.
20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   month   the month between 0-11.
20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   date    the day of the month between 1-31.
21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   hrs     the hours between 0-23.
21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   min     the minutes between 0-59.
21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Calendar
21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>Calendar.set(year + 1900, month, date,
21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * hrs, min)</code> or <code>GregorianCalendar(year + 1900,
21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * month, date, hrs, min)</code>.
21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Date(int year, int month, int date, int hrs, int min) {
22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this(year, month, date, hrs, min, 0);
22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Allocates a <code>Date</code> object and initializes it so that
22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * it represents the instant at the start of the second specified
22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * by the <code>year</code>, <code>month</code>, <code>date</code>,
22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>hrs</code>, <code>min</code>, and <code>sec</code> arguments,
22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * in the local time zone.
22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   year    the year minus 1900.
23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   month   the month between 0-11.
23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   date    the day of the month between 1-31.
23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   hrs     the hours between 0-23.
23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   min     the minutes between 0-59.
23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   sec     the seconds between 0-59.
23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Calendar
23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>Calendar.set(year + 1900, month, date,
23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * hrs, min, sec)</code> or <code>GregorianCalendar(year + 1900,
24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * month, date, hrs, min, sec)</code>.
24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Date(int year, int month, int date, int hrs, int min, int sec) {
24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int y = year + 1900;
24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // month is 0-based. So we have to normalize month to support Long.MAX_VALUE.
24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (month >= 12) {
24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            y += month / 12;
24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            month %= 12;
24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else if (month < 0) {
25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            y += CalendarUtils.floorDivide(month, 12);
25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            month = CalendarUtils.mod(month, 12);
25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        BaseCalendar cal = getCalendarSystem(y);
25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        cdate = (BaseCalendar.Date) cal.newCalendarDate(TimeZone.getDefaultRef());
25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        cdate.setNormalizedDate(y, month + 1, date).setTimeOfDay(hrs, min, sec, 0);
25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        getTimeImpl();
25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        cdate = null;
25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Allocates a <code>Date</code> object and initializes it so that
26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * it represents the date and time indicated by the string
26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>s</code>, which is interpreted as if by the
26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@link Date#parse} method.
26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   s   a string representation of the date.
26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.text.DateFormat
26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Date#parse(java.lang.String)
26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>DateFormat.parse(String s)</code>.
27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Date(String s) {
27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this(parse(s));
27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Return a copy of this object.
27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Object clone() {
28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        Date d = null;
28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            d = (Date)super.clone();
28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (cdate != null) {
28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                d.cdate = (BaseCalendar.Date) cdate.clone();
28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (CloneNotSupportedException e) {} // Won't happen
28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return d;
28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Determines the date and time based on the arguments. The
29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * arguments are interpreted as a year, month, day of the month,
29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * hour of the day, minute within the hour, and second within the
29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * minute, exactly as for the <tt>Date</tt> constructor with six
29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * arguments, except that the arguments are interpreted relative
29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * to UTC rather than to the local time zone. The time indicated is
29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * returned represented as the distance, measured in milliseconds,
29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * of that time from the epoch (00:00:00 GMT on January 1, 1970).
30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   year    the year minus 1900.
30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   month   the month between 0-11.
30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   date    the day of the month between 1-31.
30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   hrs     the hours between 0-23.
30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   min     the minutes between 0-59.
30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   sec     the seconds between 0-59.
30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  the number of milliseconds since January 1, 1970, 00:00:00 GMT for
30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          the date and time specified by the arguments.
30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Calendar
31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>Calendar.set(year + 1900, month, date,
31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * hrs, min, sec)</code> or <code>GregorianCalendar(year + 1900,
31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * month, date, hrs, min, sec)</code>, using a UTC
31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>TimeZone</code>, followed by <code>Calendar.getTime().getTime()</code>.
31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static long UTC(int year, int month, int date,
31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                           int hrs, int min, int sec) {
31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int y = year + 1900;
32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // month is 0-based. So we have to normalize month to support Long.MAX_VALUE.
32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (month >= 12) {
32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            y += month / 12;
32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            month %= 12;
32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else if (month < 0) {
32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            y += CalendarUtils.floorDivide(month, 12);
32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            month = CalendarUtils.mod(month, 12);
32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int m = month + 1;
32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        BaseCalendar cal = getCalendarSystem(y);
33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        BaseCalendar.Date udate = (BaseCalendar.Date) cal.newCalendarDate(null);
33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        udate.setNormalizedDate(y, m, date).setTimeOfDay(hrs, min, sec, 0);
33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Use a Date instance to perform normalization. Its fastTime
33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // is the UTC value after the normalization.
33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        Date d = new Date(0);
33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        d.normalize(udate);
33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return d.fastTime;
33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Attempts to interpret the string <tt>s</tt> as a representation
34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * of a date and time. If the attempt is successful, the time
34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * indicated is returned represented as the distance, measured in
34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * milliseconds, of that time from the epoch (00:00:00 GMT on
34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * January 1, 1970). If the attempt fails, an
34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <tt>IllegalArgumentException</tt> is thrown.
34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * It accepts many syntaxes; in particular, it recognizes the IETF
34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * standard date syntax: "Sat, 12 Aug 1995 13:30:00 GMT". It also
35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * understands the continental U.S. time-zone abbreviations, but for
35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * general use, a time-zone offset should be used: "Sat, 12 Aug 1995
35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * 13:30:00 GMT+0430" (4 hours, 30 minutes west of the Greenwich
35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * meridian). If no time zone is specified, the local time zone is
35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * assumed. GMT and UTC are considered equivalent.
35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The string <tt>s</tt> is processed from left to right, looking for
35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * data of interest. Any material in <tt>s</tt> that is within the
35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * ASCII parenthesis characters <tt>(</tt> and <tt>)</tt> is ignored.
35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Parentheses may be nested. Otherwise, the only characters permitted
36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * within <tt>s</tt> are these ASCII characters:
36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <blockquote><pre>
36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * abcdefghijklmnopqrstuvwxyz
36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * ABCDEFGHIJKLMNOPQRSTUVWXYZ
36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * 0123456789,+-:/</pre></blockquote>
36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * and whitespace characters.<p>
36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * A consecutive sequence of decimal digits is treated as a decimal
36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * number:<ul>
36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li>If a number is preceded by <tt>+</tt> or <tt>-</tt> and a year
36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     has already been recognized, then the number is a time-zone
37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     offset. If the number is less than 24, it is an offset measured
37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     in hours. Otherwise, it is regarded as an offset in minutes,
37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     expressed in 24-hour time format without punctuation. A
37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     preceding <tt>-</tt> means a westward offset. Time zone offsets
37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     are always relative to UTC (Greenwich). Thus, for example,
37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     <tt>-5</tt> occurring in the string would mean "five hours west
37651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     of Greenwich" and <tt>+0430</tt> would mean "four hours and
37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     thirty minutes east of Greenwich." It is permitted for the
37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     string to specify <tt>GMT</tt>, <tt>UT</tt>, or <tt>UTC</tt>
37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     redundantly-for example, <tt>GMT-5</tt> or <tt>utc+0430</tt>.
38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li>The number is regarded as a year number if one of the
38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     following conditions is true:
38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <ul>
38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     <li>The number is equal to or greater than 70 and followed by a
38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         space, comma, slash, or end of string
38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     <li>The number is less than 70, and both a month and a day of
38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *         the month have already been recognized</li>
38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * </ul>
38851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     If the recognized year number is less than 100, it is
38951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     interpreted as an abbreviated year relative to a century of
39051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     which dates are within 80 years before and 19 years after
39151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     the time when the Date class is initialized.
39251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     After adjusting the year number, 1900 is subtracted from
39351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     it. For example, if the current year is 1999 then years in
39451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     the range 19 to 99 are assumed to mean 1919 to 1999, while
39551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     years from 0 to 18 are assumed to mean 2000 to 2018.  Note
39651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     that this is slightly different from the interpretation of
39751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     years less than 100 that is used in {@link java.text.SimpleDateFormat}.
39851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li>If the number is followed by a colon, it is regarded as an hour,
39951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     unless an hour has already been recognized, in which case it is
40051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     regarded as a minute.
40151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li>If the number is followed by a slash, it is regarded as a month
40251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     (it is decreased by 1 to produce a number in the range <tt>0</tt>
40351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     to <tt>11</tt>), unless a month has already been recognized, in
40451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     which case it is regarded as a day of the month.
40551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li>If the number is followed by whitespace, a comma, a hyphen, or
40651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     end of string, then if an hour has been recognized but not a
40751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     minute, it is regarded as a minute; otherwise, if a minute has
40851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     been recognized but not a second, it is regarded as a second;
40951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     otherwise, it is regarded as a day of the month. </ul><p>
41051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * A consecutive sequence of letters is regarded as a word and treated
41151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * as follows:<ul>
41251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li>A word that matches <tt>AM</tt>, ignoring case, is ignored (but
41351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     the parse fails if an hour has not been recognized or is less
41451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     than <tt>1</tt> or greater than <tt>12</tt>).
41551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li>A word that matches <tt>PM</tt>, ignoring case, adds <tt>12</tt>
41651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     to the hour (but the parse fails if an hour has not been
41751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     recognized or is less than <tt>1</tt> or greater than <tt>12</tt>).
41851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li>Any word that matches any prefix of <tt>SUNDAY, MONDAY, TUESDAY,
41951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     WEDNESDAY, THURSDAY, FRIDAY</tt>, or <tt>SATURDAY</tt>, ignoring
42051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     case, is ignored. For example, <tt>sat, Friday, TUE</tt>, and
42151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     <tt>Thurs</tt> are ignored.
42251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li>Otherwise, any word that matches any prefix of <tt>JANUARY,
42351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER,
42451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     OCTOBER, NOVEMBER</tt>, or <tt>DECEMBER</tt>, ignoring case, and
42551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     considering them in the order given here, is recognized as
42651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     specifying a month and is converted to a number (<tt>0</tt> to
42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     <tt>11</tt>). For example, <tt>aug, Sept, april</tt>, and
42851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     <tt>NOV</tt> are recognized as months. So is <tt>Ma</tt>, which
42951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     is recognized as <tt>MARCH</tt>, not <tt>MAY</tt>.
43051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li>Any word that matches <tt>GMT, UT</tt>, or <tt>UTC</tt>, ignoring
43151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     case, is treated as referring to UTC.
43251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li>Any word that matches <tt>EST, CST, MST</tt>, or <tt>PST</tt>,
43351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     ignoring case, is recognized as referring to the time zone in
43451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     North America that is five, six, seven, or eight hours west of
43551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     Greenwich, respectively. Any word that matches <tt>EDT, CDT,
43651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     MDT</tt>, or <tt>PDT</tt>, ignoring case, is recognized as
43751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     referring to the same time zone, respectively, during daylight
43851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     saving time.</ul><p>
43951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Once the entire string s has been scanned, it is converted to a time
44051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * result in one of two ways. If a time zone or time-zone offset has been
44151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * recognized, then the year, month, day of month, hour, minute, and
44251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * second are interpreted in UTC and then the time-zone offset is
44351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * applied. Otherwise, the year, month, day of month, hour, minute, and
44451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * second are interpreted in the local time zone.
44551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
44651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   s   a string to be parsed as a date.
44751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  the number of milliseconds since January 1, 1970, 00:00:00 GMT
44851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          represented by the string argument.
44951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.text.DateFormat
45051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
45151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>DateFormat.parse(String s)</code>.
45251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
45351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
45451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static long parse(String s) {
45551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int year = Integer.MIN_VALUE;
45651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int mon = -1;
45751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int mday = -1;
45851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int hour = -1;
45951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int min = -1;
46051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int sec = -1;
46151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int millis = -1;
46251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int c = -1;
46351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int i = 0;
46451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int n = -1;
46551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int wst = -1;
46651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int tzoffset = -1;
46751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int prevc = 0;
46851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    syntax:
46951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        {
47051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (s == null)
47151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                break syntax;
47251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            int limit = s.length();
47351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            while (i < limit) {
47451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                c = s.charAt(i);
47551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                i++;
47651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (c <= ' ' || c == ',')
47751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    continue;
47851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (c == '(') { // skip comments
47951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    int depth = 1;
48051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    while (i < limit) {
48151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        c = s.charAt(i);
48251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        i++;
48351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        if (c == '(') depth++;
48451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        else if (c == ')')
48551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            if (--depth <= 0)
48651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                break;
48751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    }
48851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    continue;
48951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
49051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if ('0' <= c && c <= '9') {
49151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    n = c - '0';
49251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    while (i < limit && '0' <= (c = s.charAt(i)) && c <= '9') {
4932485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer                        n = n * 10 + c - '0';
49451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        i++;
49551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    }
49651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    if (prevc == '+' || prevc == '-' && year != Integer.MIN_VALUE) {
4976975f84c2ed72e1e26d20190b6f318718c849008Tobias Thierer                        // BEGIN Android-changed: Android specific time zone logic
4982485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer
499fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath                        if (tzoffset != 0 && tzoffset != -1)
500fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath                            break syntax;
501fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath
50251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        // timezone offset
503fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath                        if (n < 24) {
50451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            n = n * 60; // EG. "GMT-3"
505fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath
506fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath                            // Support for Timezones of the form GMT-3:30. We look for an ':" and
507fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath                            // parse the number following it as loosely as the original hours
508fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath                            // section (i.e, no range or validity checks).
509fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath                            int minutesPart = 0;
510fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath                            if (i < limit && (s.charAt(i) == ':')) {
511fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath                                i++;
512fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath                                while (i < limit && '0' <= (c = s.charAt(i)) && c <= '9') {
513fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath                                    minutesPart = (minutesPart * 10) + (c - '0');
514fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath                                    i++;
515fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath                                }
516fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath                            }
517fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath
518fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath                            n += minutesPart;
519fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath                        } else {
520fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath                            n = (n % 100) + ((n / 100) * 60); // eg "GMT-0430"
521fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath                        }
522fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath
52351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        if (prevc == '+')   // plus means east of GMT
52451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            n = -n;
525aa3cc81fcb0d35faa9a51d6bf59d48685fd4d16aTobias Thierer                        // END Android-changed: Android specific time zone logic
526fa9818c081c1c0158d80ddd9b1f92990b3e0eb30Narayan Kamath
52751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        tzoffset = n;
52851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    } else if (n >= 70)
52951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        if (year != Integer.MIN_VALUE)
53051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            break syntax;
53151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        else if (c <= ' ' || c == ',' || c == '/' || i >= limit)
53251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            // year = n < 1900 ? n : n - 1900;
53351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            year = n;
53451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        else
53551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            break syntax;
53651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    else if (c == ':')
53751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        if (hour < 0)
53851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            hour = (byte) n;
53951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        else if (min < 0)
54051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            min = (byte) n;
54151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        else
54251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            break syntax;
54351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    else if (c == '/')
54451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        if (mon < 0)
54551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            mon = (byte) (n - 1);
54651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        else if (mday < 0)
54751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            mday = (byte) n;
54851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        else
54951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            break syntax;
55051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    else if (i < limit && c != ',' && c > ' ' && c != '-')
55151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        break syntax;
55251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    else if (hour >= 0 && min < 0)
55351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        min = (byte) n;
55451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    else if (min >= 0 && sec < 0)
55551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        sec = (byte) n;
55651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    else if (mday < 0)
55751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        mday = (byte) n;
55851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    // Handle two-digit years < 70 (70-99 handled above).
55951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    else if (year == Integer.MIN_VALUE && mon >= 0 && mday >= 0)
56051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        year = n;
56151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    else
56251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        break syntax;
56351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    prevc = 0;
56451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                } else if (c == '/' || c == ':' || c == '+' || c == '-')
56551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    prevc = c;
56651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                else {
56751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    int st = i - 1;
56851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    while (i < limit) {
56951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        c = s.charAt(i);
57051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        if (!('A' <= c && c <= 'Z' || 'a' <= c && c <= 'z'))
57151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            break;
57251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        i++;
57351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    }
57451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    if (i <= st + 1)
57551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        break syntax;
57651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    int k;
57751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    for (k = wtb.length; --k >= 0;)
57851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        if (wtb[k].regionMatches(true, 0, s, st, i - st)) {
57951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            int action = ttb[k];
58051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            if (action != 0) {
58151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                if (action == 1) {  // pm
58251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                    if (hour > 12 || hour < 1)
58351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                        break syntax;
58451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                    else if (hour < 12)
58551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                        hour += 12;
58651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                } else if (action == 14) {  // am
58751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                    if (hour > 12 || hour < 1)
58851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                        break syntax;
58951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                    else if (hour == 12)
59051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                        hour = 0;
59151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                } else if (action <= 13) {  // month!
59251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                    if (mon < 0)
59351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                        mon = (byte) (action - 2);
59451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                    else
59551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                        break syntax;
59651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                } else {
59751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                    tzoffset = action - 10000;
59851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                }
59951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            }
60051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                            break;
60151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        }
60251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    if (k < 0)
60351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        break syntax;
60451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    prevc = 0;
60551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
60651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
60751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (year == Integer.MIN_VALUE || mon < 0 || mday < 0)
60851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                break syntax;
60951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            // Parse 2-digit years within the correct default century.
61051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (year < 100) {
61151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                synchronized (Date.class) {
61251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    if (defaultCenturyStart == 0) {
61351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        defaultCenturyStart = gcal.getCalendarDate().getYear() - 80;
61451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    }
61551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
61651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                year += (defaultCenturyStart / 100) * 100;
61751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (year < defaultCenturyStart) year += 100;
61851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
61951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (sec < 0)
62051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                sec = 0;
62151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (min < 0)
62251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                min = 0;
62351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (hour < 0)
62451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                hour = 0;
62551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            BaseCalendar cal = getCalendarSystem(year);
62651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (tzoffset == -1)  { // no time zone specified, have to use local
62751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                BaseCalendar.Date ldate = (BaseCalendar.Date) cal.newCalendarDate(TimeZone.getDefaultRef());
62851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ldate.setDate(year, mon + 1, mday);
62951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                ldate.setTimeOfDay(hour, min, sec, 0);
63051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                return cal.getTime(ldate);
63151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
63251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            BaseCalendar.Date udate = (BaseCalendar.Date) cal.newCalendarDate(null); // no time zone
63351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            udate.setDate(year, mon + 1, mday);
63451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            udate.setTimeOfDay(hour, min, sec, 0);
63551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return cal.getTime(udate) + tzoffset * (60 * 1000);
63651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
63751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // syntax error
63851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throw new IllegalArgumentException();
63951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
64051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private final static String wtb[] = {
64151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        "am", "pm",
64251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        "monday", "tuesday", "wednesday", "thursday", "friday",
64351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        "saturday", "sunday",
64451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        "january", "february", "march", "april", "may", "june",
64551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        "july", "august", "september", "october", "november", "december",
64651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        "gmt", "ut", "utc", "est", "edt", "cst", "cdt",
64751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        "mst", "mdt", "pst", "pdt"
64851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    };
64951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private final static int ttb[] = {
65051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        14, 1, 0, 0, 0, 0, 0, 0, 0,
65151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
65251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        10000 + 0, 10000 + 0, 10000 + 0,    // GMT/UT/UTC
65351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        10000 + 5 * 60, 10000 + 4 * 60,     // EST/EDT
65451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        10000 + 6 * 60, 10000 + 5 * 60,     // CST/CDT
65551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        10000 + 7 * 60, 10000 + 6 * 60,     // MST/MDT
65651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        10000 + 8 * 60, 10000 + 7 * 60      // PST/PDT
65751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    };
65851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
65951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
66051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a value that is the result of subtracting 1900 from the
66151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * year that contains or begins with the instant in time represented
66251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * by this <code>Date</code> object, as interpreted in the local
66351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * time zone.
66451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
66551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  the year represented by this date, minus 1900.
66651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Calendar
66751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
66851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>Calendar.get(Calendar.YEAR) - 1900</code>.
66951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
67051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
67151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getYear() {
67251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return normalize().getYear() - 1900;
67351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
67451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
67551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
67651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the year of this <tt>Date</tt> object to be the specified
67751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * value plus 1900. This <code>Date</code> object is modified so
67851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * that it represents a point in time within the specified year,
67951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * with the month, date, hour, minute, and second the same as
68051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * before, as interpreted in the local time zone. (Of course, if
68151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the date was February 29, for example, and the year is set to a
68251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * non-leap year, then the new date will be treated as if it were
68351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * on March 1.)
68451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
68551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   year    the year value.
68651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Calendar
68751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
68851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>Calendar.set(Calendar.YEAR, year + 1900)</code>.
68951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
69051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
69151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setYear(int year) {
69251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        getCalendarDate().setNormalizedYear(year + 1900);
69351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
69451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
69551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
69651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a number representing the month that contains or begins
69751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * with the instant in time represented by this <tt>Date</tt> object.
69851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The value returned is between <code>0</code> and <code>11</code>,
69951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * with the value <code>0</code> representing January.
70051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
70151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  the month represented by this date.
70251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Calendar
70351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
70451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>Calendar.get(Calendar.MONTH)</code>.
70551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
70651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
70751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getMonth() {
70851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return normalize().getMonth() - 1; // adjust 1-based to 0-based
70951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
71051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
71151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
71251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the month of this date to the specified value. This
71351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <tt>Date</tt> object is modified so that it represents a point
71451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * in time within the specified month, with the year, date, hour,
71551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * minute, and second the same as before, as interpreted in the
71651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * local time zone. If the date was October 31, for example, and
71751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the month is set to June, then the new date will be treated as
71851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * if it were on July 1, because June has only 30 days.
71951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
72051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   month   the month value between 0-11.
72151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Calendar
72251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
72351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>Calendar.set(Calendar.MONTH, int month)</code>.
72451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
72551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
72651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setMonth(int month) {
72751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int y = 0;
72851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (month >= 12) {
72951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            y = month / 12;
73051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            month %= 12;
73151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else if (month < 0) {
73251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            y = CalendarUtils.floorDivide(month, 12);
73351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            month = CalendarUtils.mod(month, 12);
73451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
73551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        BaseCalendar.Date d = getCalendarDate();
73651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (y != 0) {
73751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            d.setNormalizedYear(d.getNormalizedYear() + y);
73851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
73951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        d.setMonth(month + 1); // adjust 0-based to 1-based month numbering
74051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
74151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
74251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
74351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the day of the month represented by this <tt>Date</tt> object.
74451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The value returned is between <code>1</code> and <code>31</code>
74551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * representing the day of the month that contains or begins with the
74651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * instant in time represented by this <tt>Date</tt> object, as
74751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * interpreted in the local time zone.
74851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
74951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  the day of the month represented by this date.
75051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Calendar
75151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
75251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>Calendar.get(Calendar.DAY_OF_MONTH)</code>.
75351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
75451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
7556975f84c2ed72e1e26d20190b6f318718c849008Tobias Thierer    // Android-removed stray @deprecated tag.
75651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getDate() {
75751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return normalize().getDayOfMonth();
75851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
75951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
76051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
76151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the day of the month of this <tt>Date</tt> object to the
76251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * specified value. This <tt>Date</tt> object is modified so that
76351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * it represents a point in time within the specified day of the
76451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * month, with the year, month, hour, minute, and second the same
76551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * as before, as interpreted in the local time zone. If the date
76651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * was April 30, for example, and the date is set to 31, then it
76751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * will be treated as if it were on May 1, because April has only
76851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * 30 days.
76951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
77051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   date   the day of the month value between 1-31.
77151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Calendar
77251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
77351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>Calendar.set(Calendar.DAY_OF_MONTH, int date)</code>.
77451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
77551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
77651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setDate(int date) {
77751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        getCalendarDate().setDayOfMonth(date);
77851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
77951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
78051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
78151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the day of the week represented by this date. The
78251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * returned value (<tt>0</tt> = Sunday, <tt>1</tt> = Monday,
78351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <tt>2</tt> = Tuesday, <tt>3</tt> = Wednesday, <tt>4</tt> =
78451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Thursday, <tt>5</tt> = Friday, <tt>6</tt> = Saturday)
78551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * represents the day of the week that contains or begins with
78651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the instant in time represented by this <tt>Date</tt> object,
78751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * as interpreted in the local time zone.
78851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
78951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  the day of the week represented by this date.
79051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Calendar
79151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
79251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>Calendar.get(Calendar.DAY_OF_WEEK)</code>.
79351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
79451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
79551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getDay() {
7962485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer        return normalize().getDayOfWeek() - BaseCalendar.SUNDAY;
79751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
79851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
79951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
80051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the hour represented by this <tt>Date</tt> object. The
80151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * returned value is a number (<tt>0</tt> through <tt>23</tt>)
80251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * representing the hour within the day that contains or begins
80351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * with the instant in time represented by this <tt>Date</tt>
80451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * object, as interpreted in the local time zone.
80551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
80651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  the hour represented by this date.
80751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Calendar
80851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
80951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>Calendar.get(Calendar.HOUR_OF_DAY)</code>.
81051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
81151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
81251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getHours() {
81351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return normalize().getHours();
81451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
81551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
81651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
81751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the hour of this <tt>Date</tt> object to the specified value.
81851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This <tt>Date</tt> object is modified so that it represents a point
81951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * in time within the specified hour of the day, with the year, month,
82051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * date, minute, and second the same as before, as interpreted in the
82151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * local time zone.
82251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
82351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   hours   the hour value.
82451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Calendar
82551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
82651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>Calendar.set(Calendar.HOUR_OF_DAY, int hours)</code>.
82751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
82851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
82951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setHours(int hours) {
83051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        getCalendarDate().setHours(hours);
83151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
83251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
83351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
83451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the number of minutes past the hour represented by this date,
83551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * as interpreted in the local time zone.
83651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The value returned is between <code>0</code> and <code>59</code>.
83751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
83851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  the number of minutes past the hour represented by this date.
83951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Calendar
84051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
84151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>Calendar.get(Calendar.MINUTE)</code>.
84251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
84351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
84451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getMinutes() {
84551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return normalize().getMinutes();
84651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
84751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
84851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
84951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the minutes of this <tt>Date</tt> object to the specified value.
85051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This <tt>Date</tt> object is modified so that it represents a point
85151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * in time within the specified minute of the hour, with the year, month,
85251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * date, hour, and second the same as before, as interpreted in the
85351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * local time zone.
85451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
85551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   minutes   the value of the minutes.
85651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Calendar
85751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
85851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>Calendar.set(Calendar.MINUTE, int minutes)</code>.
85951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
86051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
86151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setMinutes(int minutes) {
86251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        getCalendarDate().setMinutes(minutes);
86351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
86451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
86551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
86651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the number of seconds past the minute represented by this date.
86751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The value returned is between <code>0</code> and <code>61</code>. The
86851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * values <code>60</code> and <code>61</code> can only occur on those
86951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Java Virtual Machines that take leap seconds into account.
87051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
87151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  the number of seconds past the minute represented by this date.
87251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Calendar
87351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
87451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>Calendar.get(Calendar.SECOND)</code>.
87551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
87651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
87751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getSeconds() {
87851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return normalize().getSeconds();
87951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
88051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
88151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
88251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets the seconds of this <tt>Date</tt> to the specified value.
88351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This <tt>Date</tt> object is modified so that it represents a
88451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * point in time within the specified second of the minute, with
88551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the year, month, date, hour, and minute the same as before, as
88651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * interpreted in the local time zone.
88751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
88851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   seconds   the seconds value.
88951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Calendar
89051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
89151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>Calendar.set(Calendar.SECOND, int seconds)</code>.
89251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
89351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
89451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setSeconds(int seconds) {
89551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        getCalendarDate().setSeconds(seconds);
89651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
89751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
89851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
89951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT
90051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * represented by this <tt>Date</tt> object.
90151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
90251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  the number of milliseconds since January 1, 1970, 00:00:00 GMT
90351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          represented by this date.
90451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
90551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public long getTime() {
90651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return getTimeImpl();
90751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
90851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
90951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private final long getTimeImpl() {
91051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (cdate != null && !cdate.isNormalized()) {
91151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            normalize();
91251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
91351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return fastTime;
91451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
91551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
91651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
91751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Sets this <code>Date</code> object to represent a point in time that is
91851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>time</code> milliseconds after January 1, 1970 00:00:00 GMT.
91951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
92051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   time   the number of milliseconds.
92151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
92251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setTime(long time) {
92351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        fastTime = time;
92451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        cdate = null;
92551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
92651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
92751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
92851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Tests if this date is before the specified date.
92951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
93051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   when   a date.
93151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  <code>true</code> if and only if the instant of time
93251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *            represented by this <tt>Date</tt> object is strictly
93351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *            earlier than the instant represented by <tt>when</tt>;
93451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          <code>false</code> otherwise.
93551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception NullPointerException if <code>when</code> is null.
93651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
93751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean before(Date when) {
93851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return getMillisOf(this) < getMillisOf(when);
93951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
94051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
94151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
94251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Tests if this date is after the specified date.
94351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
94451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   when   a date.
94551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  <code>true</code> if and only if the instant represented
94651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          by this <tt>Date</tt> object is strictly later than the
94751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          instant represented by <tt>when</tt>;
94851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          <code>false</code> otherwise.
94951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception NullPointerException if <code>when</code> is null.
95051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
95151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean after(Date when) {
95251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return getMillisOf(this) > getMillisOf(when);
95351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
95451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
95551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
95651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Compares two dates for equality.
95751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The result is <code>true</code> if and only if the argument is
95851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * not <code>null</code> and is a <code>Date</code> object that
95951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * represents the same point in time, to the millisecond, as this object.
96051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
96151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Thus, two <code>Date</code> objects are equal if and only if the
96251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>getTime</code> method returns the same <code>long</code>
96351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * value for both.
96451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
96551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   obj   the object to compare with.
96651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  <code>true</code> if the objects are the same;
96751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          <code>false</code> otherwise.
96851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Date#getTime()
96951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
97051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean equals(Object obj) {
97151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return obj instanceof Date && getTime() == ((Date) obj).getTime();
97251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
97351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
97451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
97551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the millisecond value of this <code>Date</code> object
97651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * without affecting its internal state.
97751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
97851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    static final long getMillisOf(Date date) {
97951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (date.cdate == null || date.cdate.isNormalized()) {
98051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return date.fastTime;
98151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
98251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        BaseCalendar.Date d = (BaseCalendar.Date) date.cdate.clone();
98351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return gcal.getTime(d);
98451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
98551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
98651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
98751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Compares two Dates for ordering.
98851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
98951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   anotherDate   the <code>Date</code> to be compared.
99051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  the value <code>0</code> if the argument Date is equal to
99151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          this Date; a value less than <code>0</code> if this Date
99251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          is before the Date argument; and a value greater than
99351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *      <code>0</code> if this Date is after the Date argument.
99451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since   1.2
99551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception NullPointerException if <code>anotherDate</code> is null.
99651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
99751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int compareTo(Date anotherDate) {
99851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        long thisTime = getMillisOf(this);
99951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        long anotherTime = getMillisOf(anotherDate);
100051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return (thisTime<anotherTime ? -1 : (thisTime==anotherTime ? 0 : 1));
100151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
100251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
100351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
100451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a hash code value for this object. The result is the
100551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * exclusive OR of the two halves of the primitive <tt>long</tt>
100651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * value returned by the {@link Date#getTime}
100751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * method. That is, the hash code is the value of the expression:
10082485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * <blockquote><pre>{@code
10092485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * (int)(this.getTime()^(this.getTime() >>> 32))
10102485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * }</pre></blockquote>
101151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
101251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  a hash code value for this object.
101351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
101451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int hashCode() {
101551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        long ht = this.getTime();
101651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return (int) ht ^ (int) (ht >> 32);
101751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
101851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
101951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
102051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Converts this <code>Date</code> object to a <code>String</code>
102151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * of the form:
102251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <blockquote><pre>
102351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * dow mon dd hh:mm:ss zzz yyyy</pre></blockquote>
102451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * where:<ul>
102551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li><tt>dow</tt> is the day of the week (<tt>Sun, Mon, Tue, Wed,
102651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     Thu, Fri, Sat</tt>).
102751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li><tt>mon</tt> is the month (<tt>Jan, Feb, Mar, Apr, May, Jun,
102851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     Jul, Aug, Sep, Oct, Nov, Dec</tt>).
102951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li><tt>dd</tt> is the day of the month (<tt>01</tt> through
103051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     <tt>31</tt>), as two decimal digits.
103151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li><tt>hh</tt> is the hour of the day (<tt>00</tt> through
103251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     <tt>23</tt>), as two decimal digits.
103351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li><tt>mm</tt> is the minute within the hour (<tt>00</tt> through
103451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     <tt>59</tt>), as two decimal digits.
103551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li><tt>ss</tt> is the second within the minute (<tt>00</tt> through
103651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     <tt>61</tt>, as two decimal digits.
103751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li><tt>zzz</tt> is the time zone (and may reflect daylight saving
103851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     time). Standard time zone abbreviations include those
103951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     recognized by the method <tt>parse</tt>. If time zone
104051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     information is not available, then <tt>zzz</tt> is empty -
104151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     that is, it consists of no characters at all.
104251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li><tt>yyyy</tt> is the year, as four decimal digits.
104351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * </ul>
104451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
104551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  a string representation of this date.
104651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Date#toLocaleString()
104751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Date#toGMTString()
104851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
104951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public String toString() {
105051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // "EEE MMM dd HH:mm:ss zzz yyyy";
105151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        BaseCalendar.Date date = normalize();
105251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        StringBuilder sb = new StringBuilder(28);
105351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int index = date.getDayOfWeek();
10542485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer        if (index == BaseCalendar.SUNDAY) {
105551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            index = 8;
105651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
105751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        convertToAbbr(sb, wtb[index]).append(' ');                        // EEE
105851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' ');  // MMM
105951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2).append(' '); // dd
106051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
106151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':');   // HH
106251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':'); // mm
106351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        CalendarUtils.sprintf0d(sb, date.getSeconds(), 2).append(' '); // ss
106451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        TimeZone zi = date.getZone();
106551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (zi != null) {
10662485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer            sb.append(zi.getDisplayName(date.isDaylightTime(), TimeZone.SHORT, Locale.US)); // zzz
106751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else {
106851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            sb.append("GMT");
106951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
107051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sb.append(' ').append(date.getYear());  // yyyy
107151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return sb.toString();
107251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
107351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
107451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
107551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Converts the given name to its 3-letter abbreviation (e.g.,
107651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * "monday" -> "Mon") and stored the abbreviation in the given
107751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>StringBuilder</code>.
107851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
107951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final StringBuilder convertToAbbr(StringBuilder sb, String name) {
108051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sb.append(Character.toUpperCase(name.charAt(0)));
108151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sb.append(name.charAt(1)).append(name.charAt(2));
108251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return sb;
108351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
108451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
108551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
108651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Creates a string representation of this <tt>Date</tt> object in an
108751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * implementation-dependent form. The intent is that the form should
108851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * be familiar to the user of the Java application, wherever it may
108951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * happen to be running. The intent is comparable to that of the
109051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * "<code>%c</code>" format supported by the <code>strftime()</code>
109151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * function of ISO&nbsp;C.
109251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
109351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  a string representation of this date, using the locale
109451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          conventions.
109551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.text.DateFormat
109651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Date#toString()
109751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Date#toGMTString()
109851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
109951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>DateFormat.format(Date date)</code>.
110051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
110151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
110251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public String toLocaleString() {
110351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        DateFormat formatter = DateFormat.getDateTimeInstance();
110451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return formatter.format(this);
110551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
110651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
110751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
110851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Creates a string representation of this <tt>Date</tt> object of
110951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the form:
11102485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * <blockquote><pre>
111151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * d mon yyyy hh:mm:ss GMT</pre></blockquote>
111251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * where:<ul>
111351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li><i>d</i> is the day of the month (<tt>1</tt> through <tt>31</tt>),
111451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     as one or two decimal digits.
111551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li><i>mon</i> is the month (<tt>Jan, Feb, Mar, Apr, May, Jun, Jul,
111651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     Aug, Sep, Oct, Nov, Dec</tt>).
111751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li><i>yyyy</i> is the year, as four decimal digits.
111851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li><i>hh</i> is the hour of the day (<tt>00</tt> through <tt>23</tt>),
111951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     as two decimal digits.
112051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li><i>mm</i> is the minute within the hour (<tt>00</tt> through
112151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     <tt>59</tt>), as two decimal digits.
112251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li><i>ss</i> is the second within the minute (<tt>00</tt> through
112351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     <tt>61</tt>), as two decimal digits.
112451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <li><i>GMT</i> is exactly the ASCII letters "<tt>GMT</tt>" to indicate
112551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     Greenwich Mean Time.
112651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * </ul><p>
112751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The result does not depend on the local time zone.
112851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
112951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  a string representation of this date, using the Internet GMT
113051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          conventions.
113151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.text.DateFormat
113251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Date#toString()
113351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Date#toLocaleString()
113451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
113551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>DateFormat.format(Date date)</code>, using a
113651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * GMT <code>TimeZone</code>.
113751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
113851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
113951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public String toGMTString() {
114051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // d MMM yyyy HH:mm:ss 'GMT'
114151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        long t = getTime();
114251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        BaseCalendar cal = getCalendarSystem(t);
114351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        BaseCalendar.Date date =
114451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            (BaseCalendar.Date) cal.getCalendarDate(getTime(), (TimeZone)null);
114551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        StringBuilder sb = new StringBuilder(32);
114651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 1).append(' '); // d
114751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' ');  // MMM
114851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sb.append(date.getYear()).append(' ');                            // yyyy
114951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':');      // HH
115051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':');    // mm
115151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        CalendarUtils.sprintf0d(sb, date.getSeconds(), 2);                // ss
115251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        sb.append(" GMT");                                                // ' GMT'
115351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return sb.toString();
115451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
115551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
115651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
115751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the offset, measured in minutes, for the local time zone
115851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * relative to UTC that is appropriate for the time represented by
115951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * this <code>Date</code> object.
116051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>
116151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * For example, in Massachusetts, five time zones west of Greenwich:
116251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <blockquote><pre>
116351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * new Date(96, 1, 14).getTimezoneOffset() returns 300</pre></blockquote>
116451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * because on February 14, 1996, standard time (Eastern Standard Time)
116551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * is in use, which is offset five hours from UTC; but:
116651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <blockquote><pre>
116751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * new Date(96, 5, 1).getTimezoneOffset() returns 240</pre></blockquote>
116851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * because on June 1, 1996, daylight saving time (Eastern Daylight Time)
116951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * is in use, which is offset only four hours from UTC.<p>
117051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This method produces the same result as if it computed:
117151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <blockquote><pre>
117251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * (this.getTime() - UTC(this.getYear(),
117351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                       this.getMonth(),
117451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                       this.getDate(),
117551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                       this.getHours(),
117651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                       this.getMinutes(),
117751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                       this.getSeconds())) / (60 * 1000)
117851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * </pre></blockquote>
117951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
118051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  the time-zone offset, in minutes, for the current time zone.
118151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Calendar#ZONE_OFFSET
118251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.Calendar#DST_OFFSET
118351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.util.TimeZone#getDefault
118451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated As of JDK version 1.1,
118551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * replaced by <code>-(Calendar.get(Calendar.ZONE_OFFSET) +
118651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Calendar.get(Calendar.DST_OFFSET)) / (60 * 1000)</code>.
118751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
118851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
118951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getTimezoneOffset() {
119051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int zoneOffset;
119151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (cdate == null) {
11922485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer            // Android-changed: Android specific time zone logic
11939c853c5b9ebbb0ef60a013ae10ee411d70dfa832Piotr Jastrzebski            GregorianCalendar cal = new GregorianCalendar(fastTime);
119488218876129da6f91f4c8a637c2d2c5a223795c1Narayan Kamath            zoneOffset = (cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET));
119551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else {
119651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            normalize();
119751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            zoneOffset = cdate.getZoneOffset();
119851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
119951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return -zoneOffset/60000;  // convert to minutes
120051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
120151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
120251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private final BaseCalendar.Date getCalendarDate() {
120351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (cdate == null) {
120451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            BaseCalendar cal = getCalendarSystem(fastTime);
120551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            cdate = (BaseCalendar.Date) cal.getCalendarDate(fastTime,
120651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                                            TimeZone.getDefaultRef());
120751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
120851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return cdate;
120951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
121051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
121151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private final BaseCalendar.Date normalize() {
121251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (cdate == null) {
121351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            BaseCalendar cal = getCalendarSystem(fastTime);
121451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            cdate = (BaseCalendar.Date) cal.getCalendarDate(fastTime,
121551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                                            TimeZone.getDefaultRef());
121651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return cdate;
121751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
121851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
121951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Normalize cdate with the TimeZone in cdate first. This is
122051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // required for the compatible behavior.
122151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (!cdate.isNormalized()) {
122251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            cdate = normalize(cdate);
122351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
122451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
122551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // If the default TimeZone has changed, then recalculate the
122651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // fields with the new TimeZone.
122751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        TimeZone tz = TimeZone.getDefaultRef();
122851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (tz != cdate.getZone()) {
122951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            cdate.setZone(tz);
123051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            CalendarSystem cal = getCalendarSystem(cdate);
123151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            cal.getCalendarDate(fastTime, cdate);
123251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
123351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return cdate;
123451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
123551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
123651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // fastTime and the returned data are in sync upon return.
123751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private final BaseCalendar.Date normalize(BaseCalendar.Date date) {
123851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int y = date.getNormalizedYear();
123951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int m = date.getMonth();
124051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int d = date.getDayOfMonth();
124151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int hh = date.getHours();
124251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int mm = date.getMinutes();
124351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int ss = date.getSeconds();
124451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int ms = date.getMillis();
124551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        TimeZone tz = date.getZone();
124651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
124751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // If the specified year can't be handled using a long value
124851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // in milliseconds, GregorianCalendar is used for full
124951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // compatibility with underflow and overflow. This is required
125051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // by some JCK tests. The limits are based max year values -
125151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // years that can be represented by max values of d, hh, mm,
125251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // ss and ms. Also, let GregorianCalendar handle the default
125351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // cutover year so that we don't need to worry about the
125451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // transition here.
125551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (y == 1582 || y > 280000000 || y < -280000000) {
125651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            if (tz == null) {
125751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                tz = TimeZone.getTimeZone("GMT");
125851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
125951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            GregorianCalendar gc = new GregorianCalendar(tz);
126051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            gc.clear();
12612485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer            gc.set(GregorianCalendar.MILLISECOND, ms);
126251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            gc.set(y, m-1, d, hh, mm, ss);
126351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            fastTime = gc.getTimeInMillis();
126451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            BaseCalendar cal = getCalendarSystem(fastTime);
126551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            date = (BaseCalendar.Date) cal.getCalendarDate(fastTime, tz);
126651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return date;
126751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
126851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
126951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        BaseCalendar cal = getCalendarSystem(y);
127051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (cal != getCalendarSystem(date)) {
127151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            date = (BaseCalendar.Date) cal.newCalendarDate(tz);
127251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            date.setNormalizedDate(y, m, d).setTimeOfDay(hh, mm, ss, ms);
127351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
127451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Perform the GregorianCalendar-style normalization.
127551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        fastTime = cal.getTime(date);
127651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
127751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // In case the normalized date requires the other calendar
127851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // system, we need to recalculate it using the other one.
127951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        BaseCalendar ncal = getCalendarSystem(fastTime);
128051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (ncal != cal) {
128151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            date = (BaseCalendar.Date) ncal.newCalendarDate(tz);
128251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            date.setNormalizedDate(y, m, d).setTimeOfDay(hh, mm, ss, ms);
128351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            fastTime = ncal.getTime(date);
128451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
128551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return date;
128651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
128751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
128851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
128951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the Gregorian or Julian calendar system to use with the
129051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * given date. Use Gregorian from October 15, 1582.
129151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
129251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param year normalized calendar year (not -1900)
129351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the CalendarSystem to use for the specified date
129451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
129551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final BaseCalendar getCalendarSystem(int year) {
129651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (year >= 1582) {
129751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return gcal;
129851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
129951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return getJulianCalendar();
130051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
130151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
130251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final BaseCalendar getCalendarSystem(long utc) {
130351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // Quickly check if the time stamp given by `utc' is the Epoch
130451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // or later. If it's before 1970, we convert the cutover to
130551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // local time to compare.
130651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (utc >= 0
130751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            || utc >= GregorianCalendar.DEFAULT_GREGORIAN_CUTOVER
130851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        - TimeZone.getDefaultRef().getOffset(utc)) {
130951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return gcal;
131051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
131151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return getJulianCalendar();
131251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
131351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
131451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static final BaseCalendar getCalendarSystem(BaseCalendar.Date cdate) {
131551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (jcal == null) {
131651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return gcal;
131751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
131851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (cdate.getEra() != null) {
131951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return jcal;
132051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
132151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return gcal;
132251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
132351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
132451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    synchronized private static final BaseCalendar getJulianCalendar() {
132551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (jcal == null) {
132651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            jcal = (BaseCalendar) CalendarSystem.forName("julian");
132751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
132851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return jcal;
132951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
133051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
133151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
133251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Save the state of this object to a stream (i.e., serialize it).
133351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
133451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @serialData The value returned by <code>getTime()</code>
133551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *             is emitted (long).  This represents the offset from
133651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *             January 1, 1970, 00:00:00 GMT in milliseconds.
133751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
133851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private void writeObject(ObjectOutputStream s)
133951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         throws IOException
134051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
134151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        s.writeLong(getTimeImpl());
134251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
134351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
134451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
134551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Reconstitute this object from a stream (i.e., deserialize it).
134651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
134751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private void readObject(ObjectInputStream s)
134851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski         throws IOException, ClassNotFoundException
134951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
135051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        fastTime = s.readLong();
135151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
13522485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer
13532485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer    /**
13542485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * Obtains an instance of {@code Date} from an {@code Instant} object.
13552485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * <p>
13562485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * {@code Instant} uses a precision of nanoseconds, whereas {@code Date}
13572485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * uses a precision of milliseconds.  The conversion will trancate any
13582485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * excess precision information as though the amount in nanoseconds was
13592485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * subject to integer division by one million.
13602485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * <p>
13612485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * {@code Instant} can store points on the time-line further in the future
13622485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * and further in the past than {@code Date}. In this scenario, this method
13632485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * will throw an exception.
13642485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     *
13652485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * @param instant  the instant to convert
13662485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * @return a {@code Date} representing the same point on the time-line as
13672485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     *  the provided instant
13682485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * @exception NullPointerException if {@code instant} is null.
13692485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * @exception IllegalArgumentException if the instant is too large to
13702485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     *  represent as a {@code Date}
13712485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * @since 1.8
13722485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     */
13732485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer    public static Date from(Instant instant) {
13742485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer        try {
13752485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer            return new Date(instant.toEpochMilli());
13762485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer        } catch (ArithmeticException ex) {
13772485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer            throw new IllegalArgumentException(ex);
13782485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer        }
13792485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer    }
13802485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer
13812485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer    /**
13822485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * Converts this {@code Date} object to an {@code Instant}.
13832485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * <p>
13842485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * The conversion creates an {@code Instant} that represents the same
13852485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * point on the time-line as this {@code Date}.
13862485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     *
13872485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * @return an instant representing the same point on the time-line as
13882485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     *  this {@code Date} object
13892485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     * @since 1.8
13902485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer     */
13912485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer    public Instant toInstant() {
13922485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer        return Instant.ofEpochMilli(getTime());
13932485f0b24ad267fa1134dd84b3bb47d3cf9b8d21Tobias Thierer    }
139451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
1395