Source Code Cross Referenced for Date.java in  » 6.0-JDK-Core » Collections-Jar-Zip-Logging-regex » java » util » Java Source Code / Java DocumentationJava Source Code and Java Documentation

Java Source Code / Java Documentation
1. 6.0 JDK Core
2. 6.0 JDK Modules
3. 6.0 JDK Modules com.sun
4. 6.0 JDK Modules com.sun.java
5. 6.0 JDK Modules sun
6. 6.0 JDK Platform
7. Ajax
8. Apache Harmony Java SE
9. Aspect oriented
10. Authentication Authorization
11. Blogger System
12. Build
13. Byte Code
14. Cache
15. Chart
16. Chat
17. Code Analyzer
18. Collaboration
19. Content Management System
20. Database Client
21. Database DBMS
22. Database JDBC Connection Pool
23. Database ORM
24. Development
25. EJB Server geronimo
26. EJB Server GlassFish
27. EJB Server JBoss 4.2.1
28. EJB Server resin 3.1.5
29. ERP CRM Financial
30. ESB
31. Forum
32. GIS
33. Graphic Library
34. Groupware
35. HTML Parser
36. IDE
37. IDE Eclipse
38. IDE Netbeans
39. Installer
40. Internationalization Localization
41. Inversion of Control
42. Issue Tracking
43. J2EE
44. JBoss
45. JMS
46. JMX
47. Library
48. Mail Clients
49. Net
50. Parser
51. PDF
52. Portal
53. Profiler
54. Project Management
55. Report
56. RSS RDF
57. Rule Engine
58. Science
59. Scripting
60. Search Engine
61. Security
62. Sevlet Container
63. Source Control
64. Swing Library
65. Template Engine
66. Test Coverage
67. Testing
68. UML
69. Web Crawler
70. Web Framework
71. Web Mail
72. Web Server
73. Web Services
74. Web Services apache cxf 2.0.1
75. Web Services AXIS2
76. Wiki Engine
77. Workflow Engines
78. XML
79. XML UI
Java
Java Tutorial
Java Open Source
Jar File Download
Java Articles
Java Products
Java by API
C# / C Sharp
C# / CSharp Tutorial
ASP.Net
JavaScript DHTML
JavaScript Tutorial
JavaScript Reference
HTML / CSS
HTML CSS Reference
C / ANSI-C
C Tutorial
C++
C++ Tutorial
PHP
Python
SQL Server / T-SQL
Oracle PL / SQL
Oracle PL/SQL Tutorial
PostgreSQL
SQL / MySQL
MySQL Tutorial
VB.Net
VB.Net Tutorial
Flash / Flex / ActionScript
VBA / Excel / Access / Word
Microsoft Office PowerPoint 2007 Tutorial
Microsoft Office Excel 2007 Tutorial
Microsoft Office Word 2007 Tutorial
Java Source Code / Java Documentation » 6.0 JDK Core » Collections Jar Zip Logging regex » java.util 
Source Cross Referenced  Class Diagram Java Document (Java Doc) 


0001:        /*
0002:         * Copyright 1994-2006 Sun Microsystems, Inc.  All Rights Reserved.
0003:         * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0004:         *
0005:         * This code is free software; you can redistribute it and/or modify it
0006:         * under the terms of the GNU General Public License version 2 only, as
0007:         * published by the Free Software Foundation.  Sun designates this
0008:         * particular file as subject to the "Classpath" exception as provided
0009:         * by Sun in the LICENSE file that accompanied this code.
0010:         *
0011:         * This code is distributed in the hope that it will be useful, but WITHOUT
0012:         * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0013:         * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
0014:         * version 2 for more details (a copy is included in the LICENSE file that
0015:         * accompanied this code).
0016:         *
0017:         * You should have received a copy of the GNU General Public License version
0018:         * 2 along with this work; if not, write to the Free Software Foundation,
0019:         * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0020:         *
0021:         * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
0022:         * CA 95054 USA or visit www.sun.com if you need additional information or
0023:         * have any questions.
0024:         */
0025:
0026:        package java.util;
0027:
0028:        import java.text.DateFormat;
0029:        import java.io.IOException;
0030:        import java.io.ObjectOutputStream;
0031:        import java.io.ObjectInputStream;
0032:        import java.lang.ref.SoftReference;
0033:        import sun.util.calendar.BaseCalendar;
0034:        import sun.util.calendar.CalendarDate;
0035:        import sun.util.calendar.CalendarSystem;
0036:        import sun.util.calendar.CalendarUtils;
0037:        import sun.util.calendar.Era;
0038:        import sun.util.calendar.Gregorian;
0039:        import sun.util.calendar.ZoneInfo;
0040:
0041:        /**
0042:         * The class <code>Date</code> represents a specific instant
0043:         * in time, with millisecond precision.
0044:         * <p>
0045:         * Prior to JDK&nbsp;1.1, the class <code>Date</code> had two additional
0046:         * functions.  It allowed the interpretation of dates as year, month, day, hour,
0047:         * minute, and second values.  It also allowed the formatting and parsing
0048:         * of date strings.  Unfortunately, the API for these functions was not
0049:         * amenable to internationalization.  As of JDK&nbsp;1.1, the
0050:         * <code>Calendar</code> class should be used to convert between dates and time
0051:         * fields and the <code>DateFormat</code> class should be used to format and
0052:         * parse date strings.
0053:         * The corresponding methods in <code>Date</code> are deprecated.
0054:         * <p>
0055:         * Although the <code>Date</code> class is intended to reflect 
0056:         * coordinated universal time (UTC), it may not do so exactly, 
0057:         * depending on the host environment of the Java Virtual Machine. 
0058:         * Nearly all modern operating systems assume that 1&nbsp;day&nbsp;=
0059:         * 24&nbsp;&times;&nbsp;60&nbsp;&times;&nbsp;60&nbsp;= 86400 seconds 
0060:         * in all cases. In UTC, however, about once every year or two there 
0061:         * is an extra second, called a "leap second." The leap 
0062:         * second is always added as the last second of the day, and always 
0063:         * on December 31 or June 30. For example, the last minute of the 
0064:         * year 1995 was 61 seconds long, thanks to an added leap second. 
0065:         * Most computer clocks are not accurate enough to be able to reflect 
0066:         * the leap-second distinction. 
0067:         * <p>
0068:         * Some computer standards are defined in terms of Greenwich mean 
0069:         * time (GMT), which is equivalent to universal time (UT).  GMT is 
0070:         * the "civil" name for the standard; UT is the 
0071:         * "scientific" name for the same standard. The 
0072:         * distinction between UTC and UT is that UTC is based on an atomic 
0073:         * clock and UT is based on astronomical observations, which for all 
0074:         * practical purposes is an invisibly fine hair to split. Because the 
0075:         * earth's rotation is not uniform (it slows down and speeds up 
0076:         * in complicated ways), UT does not always flow uniformly. Leap 
0077:         * seconds are introduced as needed into UTC so as to keep UTC within 
0078:         * 0.9 seconds of UT1, which is a version of UT with certain 
0079:         * corrections applied. There are other time and date systems as 
0080:         * well; for example, the time scale used by the satellite-based 
0081:         * global positioning system (GPS) is synchronized to UTC but is 
0082:         * <i>not</i> adjusted for leap seconds. An interesting source of 
0083:         * further information is the U.S. Naval Observatory, particularly 
0084:         * the Directorate of Time at:
0085:         * <blockquote><pre>
0086:         *     <a href=http://tycho.usno.navy.mil>http://tycho.usno.navy.mil</a>
0087:         * </pre></blockquote>
0088:         * <p>
0089:         * and their definitions of "Systems of Time" at:
0090:         * <blockquote><pre>
0091:         *     <a href=http://tycho.usno.navy.mil/systime.html>http://tycho.usno.navy.mil/systime.html</a>
0092:         * </pre></blockquote>
0093:         * <p>
0094:         * In all methods of class <code>Date</code> that accept or return 
0095:         * year, month, date, hours, minutes, and seconds values, the 
0096:         * following representations are used: 
0097:         * <ul>
0098:         * <li>A year <i>y</i> is represented by the integer 
0099:         *     <i>y</i>&nbsp;<code>-&nbsp;1900</code>. 
0100:         * <li>A month is represented by an integer from 0 to 11; 0 is January, 
0101:         *     1 is February, and so forth; thus 11 is December. 
0102:         * <li>A date (day of month) is represented by an integer from 1 to 31 
0103:         *     in the usual manner. 
0104:         * <li>An hour is represented by an integer from 0 to 23. Thus, the hour 
0105:         *     from midnight to 1 a.m. is hour 0, and the hour from noon to 1 
0106:         *     p.m. is hour 12. 
0107:         * <li>A minute is represented by an integer from 0 to 59 in the usual manner.
0108:         * <li>A second is represented by an integer from 0 to 61; the values 60 and 
0109:         *     61 occur only for leap seconds and even then only in Java 
0110:         *     implementations that actually track leap seconds correctly. Because 
0111:         *     of the manner in which leap seconds are currently introduced, it is 
0112:         *     extremely unlikely that two leap seconds will occur in the same 
0113:         *     minute, but this specification follows the date and time conventions 
0114:         *     for ISO C.
0115:         * </ul>
0116:         * <p>
0117:         * In all cases, arguments given to methods for these purposes need 
0118:         * not fall within the indicated ranges; for example, a date may be 
0119:         * specified as January 32 and is interpreted as meaning February 1.
0120:         *
0121:         * @author  James Gosling
0122:         * @author  Arthur van Hoff
0123:         * @author  Alan Liu
0124:         * @version 1.90, 05/05/07
0125:         * @see     java.text.DateFormat
0126:         * @see     java.util.Calendar
0127:         * @see     java.util.TimeZone
0128:         * @since   JDK1.0
0129:         */
0130:        public class Date implements  java.io.Serializable, Cloneable,
0131:                Comparable<Date> {
0132:            private static final BaseCalendar gcal = CalendarSystem
0133:                    .getGregorianCalendar();
0134:            private static BaseCalendar jcal;
0135:
0136:            private transient long fastTime;
0137:
0138:            /*
0139:             * If cdate is null, then fastTime indicates the time in millis.
0140:             * If cdate.isNormalized() is true, then fastTime and cdate are in
0141:             * synch. Otherwise, fastTime is ignored, and cdate indicates the
0142:             * time.
0143:             */
0144:            private transient BaseCalendar.Date cdate;
0145:
0146:            // Initialized just before the value is used. See parse().
0147:            private static int defaultCenturyStart;
0148:
0149:            /* use serialVersionUID from modified java.util.Date for
0150:             * interoperability with JDK1.1. The Date was modified to write
0151:             * and read only the UTC time.
0152:             */
0153:            private static final long serialVersionUID = 7523967970034938905L;
0154:
0155:            /**
0156:             * Allocates a <code>Date</code> object and initializes it so that 
0157:             * it represents the time at which it was allocated, measured to the 
0158:             * nearest millisecond. 
0159:             *
0160:             * @see     java.lang.System#currentTimeMillis()
0161:             */
0162:            public Date() {
0163:                this (System.currentTimeMillis());
0164:            }
0165:
0166:            /**
0167:             * Allocates a <code>Date</code> object and initializes it to 
0168:             * represent the specified number of milliseconds since the 
0169:             * standard base time known as "the epoch", namely January 1, 
0170:             * 1970, 00:00:00 GMT. 
0171:             *
0172:             * @param   date   the milliseconds since January 1, 1970, 00:00:00 GMT.
0173:             * @see     java.lang.System#currentTimeMillis()
0174:             */
0175:            public Date(long date) {
0176:                fastTime = date;
0177:            }
0178:
0179:            /**
0180:             * Allocates a <code>Date</code> object and initializes it so that 
0181:             * it represents midnight, local time, at the beginning of the day 
0182:             * specified by the <code>year</code>, <code>month</code>, and 
0183:             * <code>date</code> arguments. 
0184:             *
0185:             * @param   year    the year minus 1900.
0186:             * @param   month   the month between 0-11.
0187:             * @param   date    the day of the month between 1-31.
0188:             * @see     java.util.Calendar
0189:             * @deprecated As of JDK version 1.1,
0190:             * replaced by <code>Calendar.set(year + 1900, month, date)</code>
0191:             * or <code>GregorianCalendar(year + 1900, month, date)</code>.
0192:             */
0193:            @Deprecated
0194:            public Date(int year, int month, int date) {
0195:                this (year, month, date, 0, 0, 0);
0196:            }
0197:
0198:            /**
0199:             * Allocates a <code>Date</code> object and initializes it so that 
0200:             * it represents the instant at the start of the minute specified by 
0201:             * the <code>year</code>, <code>month</code>, <code>date</code>, 
0202:             * <code>hrs</code>, and <code>min</code> arguments, in the local 
0203:             * time zone. 
0204:             *
0205:             * @param   year    the year minus 1900.
0206:             * @param   month   the month between 0-11.
0207:             * @param   date    the day of the month between 1-31.
0208:             * @param   hrs     the hours between 0-23.
0209:             * @param   min     the minutes between 0-59.
0210:             * @see     java.util.Calendar
0211:             * @deprecated As of JDK version 1.1,
0212:             * replaced by <code>Calendar.set(year + 1900, month, date,
0213:             * hrs, min)</code> or <code>GregorianCalendar(year + 1900,
0214:             * month, date, hrs, min)</code>.
0215:             */
0216:            @Deprecated
0217:            public Date(int year, int month, int date, int hrs, int min) {
0218:                this (year, month, date, hrs, min, 0);
0219:            }
0220:
0221:            /**
0222:             * Allocates a <code>Date</code> object and initializes it so that 
0223:             * it represents the instant at the start of the second specified 
0224:             * by the <code>year</code>, <code>month</code>, <code>date</code>, 
0225:             * <code>hrs</code>, <code>min</code>, and <code>sec</code> arguments, 
0226:             * in the local time zone. 
0227:             *
0228:             * @param   year    the year minus 1900.
0229:             * @param   month   the month between 0-11.
0230:             * @param   date    the day of the month between 1-31.
0231:             * @param   hrs     the hours between 0-23.
0232:             * @param   min     the minutes between 0-59.
0233:             * @param   sec     the seconds between 0-59.
0234:             * @see     java.util.Calendar
0235:             * @deprecated As of JDK version 1.1,
0236:             * replaced by <code>Calendar.set(year + 1900, month, date,
0237:             * hrs, min, sec)</code> or <code>GregorianCalendar(year + 1900,
0238:             * month, date, hrs, min, sec)</code>.
0239:             */
0240:            @Deprecated
0241:            public Date(int year, int month, int date, int hrs, int min, int sec) {
0242:                int y = year + 1900;
0243:                // month is 0-based. So we have to normalize month to support Long.MAX_VALUE.
0244:                if (month >= 12) {
0245:                    y += month / 12;
0246:                    month %= 12;
0247:                } else if (month < 0) {
0248:                    y += CalendarUtils.floorDivide(month, 12);
0249:                    month = CalendarUtils.mod(month, 12);
0250:                }
0251:                BaseCalendar cal = getCalendarSystem(y);
0252:                cdate = (BaseCalendar.Date) cal.newCalendarDate(TimeZone
0253:                        .getDefaultRef());
0254:                cdate.setNormalizedDate(y, month + 1, date).setTimeOfDay(hrs,
0255:                        min, sec, 0);
0256:                getTimeImpl();
0257:                cdate = null;
0258:            }
0259:
0260:            /**
0261:             * Allocates a <code>Date</code> object and initializes it so that 
0262:             * it represents the date and time indicated by the string 
0263:             * <code>s</code>, which is interpreted as if by the 
0264:             * {@link Date#parse} method. 
0265:             *
0266:             * @param   s   a string representation of the date.
0267:             * @see     java.text.DateFormat
0268:             * @see     java.util.Date#parse(java.lang.String)
0269:             * @deprecated As of JDK version 1.1,
0270:             * replaced by <code>DateFormat.parse(String s)</code>.
0271:             */
0272:            @Deprecated
0273:            public Date(String s) {
0274:                this (parse(s));
0275:            }
0276:
0277:            /**
0278:             * Return a copy of this object.
0279:             */
0280:            public Object clone() {
0281:                Date d = null;
0282:                try {
0283:                    d = (Date) super .clone();
0284:                    if (cdate != null) {
0285:                        d.cdate = (BaseCalendar.Date) cdate.clone();
0286:                    }
0287:                } catch (CloneNotSupportedException e) {
0288:                } // Won't happen
0289:                return d;
0290:            }
0291:
0292:            /**
0293:             * Determines the date and time based on the arguments. The 
0294:             * arguments are interpreted as a year, month, day of the month, 
0295:             * hour of the day, minute within the hour, and second within the 
0296:             * minute, exactly as for the <tt>Date</tt> constructor with six 
0297:             * arguments, except that the arguments are interpreted relative 
0298:             * to UTC rather than to the local time zone. The time indicated is 
0299:             * returned represented as the distance, measured in milliseconds, 
0300:             * of that time from the epoch (00:00:00 GMT on January 1, 1970).
0301:             *
0302:             * @param   year    the year minus 1900.
0303:             * @param   month   the month between 0-11.
0304:             * @param   date    the day of the month between 1-31.
0305:             * @param   hrs     the hours between 0-23.
0306:             * @param   min     the minutes between 0-59.
0307:             * @param   sec     the seconds between 0-59.
0308:             * @return  the number of milliseconds since January 1, 1970, 00:00:00 GMT for
0309:             *          the date and time specified by the arguments. 
0310:             * @see     java.util.Calendar
0311:             * @deprecated As of JDK version 1.1,
0312:             * replaced by <code>Calendar.set(year + 1900, month, date,
0313:             * hrs, min, sec)</code> or <code>GregorianCalendar(year + 1900,
0314:             * month, date, hrs, min, sec)</code>, using a UTC
0315:             * <code>TimeZone</code>, followed by <code>Calendar.getTime().getTime()</code>.
0316:             */
0317:            @Deprecated
0318:            public static long UTC(int year, int month, int date, int hrs,
0319:                    int min, int sec) {
0320:                int y = year + 1900;
0321:                // month is 0-based. So we have to normalize month to support Long.MAX_VALUE.
0322:                if (month >= 12) {
0323:                    y += month / 12;
0324:                    month %= 12;
0325:                } else if (month < 0) {
0326:                    y += CalendarUtils.floorDivide(month, 12);
0327:                    month = CalendarUtils.mod(month, 12);
0328:                }
0329:                int m = month + 1;
0330:                BaseCalendar cal = getCalendarSystem(y);
0331:                BaseCalendar.Date udate = (BaseCalendar.Date) cal
0332:                        .newCalendarDate(null);
0333:                udate.setNormalizedDate(y, m, date).setTimeOfDay(hrs, min, sec,
0334:                        0);
0335:
0336:                // Use a Date instance to perform normalization. Its fastTime
0337:                // is the UTC value after the normalization.
0338:                Date d = new Date(0);
0339:                d.normalize(udate);
0340:                return d.fastTime;
0341:            }
0342:
0343:            /**
0344:             * Attempts to interpret the string <tt>s</tt> as a representation 
0345:             * of a date and time. If the attempt is successful, the time 
0346:             * indicated is returned represented as the distance, measured in 
0347:             * milliseconds, of that time from the epoch (00:00:00 GMT on 
0348:             * January 1, 1970). If the attempt fails, an 
0349:             * <tt>IllegalArgumentException</tt> is thrown.
0350:             * <p>
0351:             * It accepts many syntaxes; in particular, it recognizes the IETF 
0352:             * standard date syntax: "Sat, 12 Aug 1995 13:30:00 GMT". It also 
0353:             * understands the continental U.S. time-zone abbreviations, but for 
0354:             * general use, a time-zone offset should be used: "Sat, 12 Aug 1995 
0355:             * 13:30:00 GMT+0430" (4 hours, 30 minutes west of the Greenwich 
0356:             * meridian). If no time zone is specified, the local time zone is 
0357:             * assumed. GMT and UTC are considered equivalent.
0358:             * <p>
0359:             * The string <tt>s</tt> is processed from left to right, looking for 
0360:             * data of interest. Any material in <tt>s</tt> that is within the 
0361:             * ASCII parenthesis characters <tt>(</tt> and <tt>)</tt> is ignored. 
0362:             * Parentheses may be nested. Otherwise, the only characters permitted 
0363:             * within <tt>s</tt> are these ASCII characters:
0364:             * <blockquote><pre>
0365:             * abcdefghijklmnopqrstuvwxyz
0366:             * ABCDEFGHIJKLMNOPQRSTUVWXYZ
0367:             * 0123456789,+-:/</pre></blockquote>
0368:             * and whitespace characters.<p>
0369:             * A consecutive sequence of decimal digits is treated as a decimal 
0370:             * number:<ul>
0371:             * <li>If a number is preceded by <tt>+</tt> or <tt>-</tt> and a year 
0372:             *     has already been recognized, then the number is a time-zone 
0373:             *     offset. If the number is less than 24, it is an offset measured 
0374:             *     in hours. Otherwise, it is regarded as an offset in minutes, 
0375:             *     expressed in 24-hour time format without punctuation. A 
0376:             *     preceding <tt>-</tt> means a westward offset. Time zone offsets 
0377:             *     are always relative to UTC (Greenwich). Thus, for example, 
0378:             *     <tt>-5</tt> occurring in the string would mean "five hours west 
0379:             *     of Greenwich" and <tt>+0430</tt> would mean "four hours and 
0380:             *     thirty minutes east of Greenwich." It is permitted for the 
0381:             *     string to specify <tt>GMT</tt>, <tt>UT</tt>, or <tt>UTC</tt> 
0382:             *     redundantly-for example, <tt>GMT-5</tt> or <tt>utc+0430</tt>.
0383:             * <li>The number is regarded as a year number if one of the
0384:             *     following conditions is true:
0385:             * <ul>
0386:             *     <li>The number is equal to or greater than 70 and followed by a
0387:             *         space, comma, slash, or end of string
0388:             *     <li>The number is less than 70, and both a month and a day of
0389:             *         the month have already been recognized</li>
0390:             * </ul>
0391:             *     If the recognized year number is less than 100, it is
0392:             *     interpreted as an abbreviated year relative to a century of
0393:             *     which dates are within 80 years before and 19 years after
0394:             *     the time when the Date class is initialized.
0395:             *     After adjusting the year number, 1900 is subtracted from
0396:             *     it. For example, if the current year is 1999 then years in
0397:             *     the range 19 to 99 are assumed to mean 1919 to 1999, while
0398:             *     years from 0 to 18 are assumed to mean 2000 to 2018.  Note
0399:             *     that this is slightly different from the interpretation of
0400:             *     years less than 100 that is used in {@link java.text.SimpleDateFormat}.
0401:             * <li>If the number is followed by a colon, it is regarded as an hour, 
0402:             *     unless an hour has already been recognized, in which case it is 
0403:             *     regarded as a minute.
0404:             * <li>If the number is followed by a slash, it is regarded as a month 
0405:             *     (it is decreased by 1 to produce a number in the range <tt>0</tt> 
0406:             *     to <tt>11</tt>), unless a month has already been recognized, in 
0407:             *     which case it is regarded as a day of the month.
0408:             * <li>If the number is followed by whitespace, a comma, a hyphen, or 
0409:             *     end of string, then if an hour has been recognized but not a 
0410:             *     minute, it is regarded as a minute; otherwise, if a minute has 
0411:             *     been recognized but not a second, it is regarded as a second; 
0412:             *     otherwise, it is regarded as a day of the month. </ul><p>
0413:             * A consecutive sequence of letters is regarded as a word and treated 
0414:             * as follows:<ul>
0415:             * <li>A word that matches <tt>AM</tt>, ignoring case, is ignored (but 
0416:             *     the parse fails if an hour has not been recognized or is less 
0417:             *     than <tt>1</tt> or greater than <tt>12</tt>).
0418:             * <li>A word that matches <tt>PM</tt>, ignoring case, adds <tt>12</tt> 
0419:             *     to the hour (but the parse fails if an hour has not been 
0420:             *     recognized or is less than <tt>1</tt> or greater than <tt>12</tt>).
0421:             * <li>Any word that matches any prefix of <tt>SUNDAY, MONDAY, TUESDAY, 
0422:             *     WEDNESDAY, THURSDAY, FRIDAY</tt>, or <tt>SATURDAY</tt>, ignoring 
0423:             *     case, is ignored. For example, <tt>sat, Friday, TUE</tt>, and 
0424:             *     <tt>Thurs</tt> are ignored.
0425:             * <li>Otherwise, any word that matches any prefix of <tt>JANUARY, 
0426:             *     FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, 
0427:             *     OCTOBER, NOVEMBER</tt>, or <tt>DECEMBER</tt>, ignoring case, and 
0428:             *     considering them in the order given here, is recognized as
0429:             *     specifying a month and is converted to a number (<tt>0</tt> to 
0430:             *     <tt>11</tt>). For example, <tt>aug, Sept, april</tt>, and 
0431:             *     <tt>NOV</tt> are recognized as months. So is <tt>Ma</tt>, which 
0432:             *     is recognized as <tt>MARCH</tt>, not <tt>MAY</tt>.
0433:             * <li>Any word that matches <tt>GMT, UT</tt>, or <tt>UTC</tt>, ignoring 
0434:             *     case, is treated as referring to UTC. 
0435:             * <li>Any word that matches <tt>EST, CST, MST</tt>, or <tt>PST</tt>, 
0436:             *     ignoring case, is recognized as referring to the time zone in 
0437:             *     North America that is five, six, seven, or eight hours west of 
0438:             *     Greenwich, respectively. Any word that matches <tt>EDT, CDT, 
0439:             *     MDT</tt>, or <tt>PDT</tt>, ignoring case, is recognized as 
0440:             *     referring to the same time zone, respectively, during daylight 
0441:             *     saving time.</ul><p>
0442:             * Once the entire string s has been scanned, it is converted to a time 
0443:             * result in one of two ways. If a time zone or time-zone offset has been 
0444:             * recognized, then the year, month, day of month, hour, minute, and 
0445:             * second are interpreted in UTC and then the time-zone offset is 
0446:             * applied. Otherwise, the year, month, day of month, hour, minute, and 
0447:             * second are interpreted in the local time zone.
0448:             *
0449:             * @param   s   a string to be parsed as a date.
0450:             * @return  the number of milliseconds since January 1, 1970, 00:00:00 GMT
0451:             *          represented by the string argument.
0452:             * @see     java.text.DateFormat
0453:             * @deprecated As of JDK version 1.1,
0454:             * replaced by <code>DateFormat.parse(String s)</code>.
0455:             */
0456:            @Deprecated
0457:            public static long parse(String s) {
0458:                int year = Integer.MIN_VALUE;
0459:                int mon = -1;
0460:                int mday = -1;
0461:                int hour = -1;
0462:                int min = -1;
0463:                int sec = -1;
0464:                int millis = -1;
0465:                int c = -1;
0466:                int i = 0;
0467:                int n = -1;
0468:                int wst = -1;
0469:                int tzoffset = -1;
0470:                int prevc = 0;
0471:                syntax: {
0472:                    if (s == null)
0473:                        break syntax;
0474:                    int limit = s.length();
0475:                    while (i < limit) {
0476:                        c = s.charAt(i);
0477:                        i++;
0478:                        if (c <= ' ' || c == ',')
0479:                            continue;
0480:                        if (c == '(') { // skip comments
0481:                            int depth = 1;
0482:                            while (i < limit) {
0483:                                c = s.charAt(i);
0484:                                i++;
0485:                                if (c == '(')
0486:                                    depth++;
0487:                                else if (c == ')')
0488:                                    if (--depth <= 0)
0489:                                        break;
0490:                            }
0491:                            continue;
0492:                        }
0493:                        if ('0' <= c && c <= '9') {
0494:                            n = c - '0';
0495:                            while (i < limit && '0' <= (c = s.charAt(i))
0496:                                    && c <= '9') {
0497:                                n = n * 10 + c - '0';
0498:                                i++;
0499:                            }
0500:                            if (prevc == '+' || prevc == '-'
0501:                                    && year != Integer.MIN_VALUE) {
0502:                                // timezone offset
0503:                                if (n < 24)
0504:                                    n = n * 60; // EG. "GMT-3"
0505:                                else
0506:                                    n = n % 100 + n / 100 * 60; // eg "GMT-0430"
0507:                                if (prevc == '+') // plus means east of GMT
0508:                                    n = -n;
0509:                                if (tzoffset != 0 && tzoffset != -1)
0510:                                    break syntax;
0511:                                tzoffset = n;
0512:                            } else if (n >= 70)
0513:                                if (year != Integer.MIN_VALUE)
0514:                                    break syntax;
0515:                                else if (c <= ' ' || c == ',' || c == '/'
0516:                                        || i >= limit)
0517:                                    // year = n < 1900 ? n : n - 1900;
0518:                                    year = n;
0519:                                else
0520:                                    break syntax;
0521:                            else if (c == ':')
0522:                                if (hour < 0)
0523:                                    hour = (byte) n;
0524:                                else if (min < 0)
0525:                                    min = (byte) n;
0526:                                else
0527:                                    break syntax;
0528:                            else if (c == '/')
0529:                                if (mon < 0)
0530:                                    mon = (byte) (n - 1);
0531:                                else if (mday < 0)
0532:                                    mday = (byte) n;
0533:                                else
0534:                                    break syntax;
0535:                            else if (i < limit && c != ',' && c > ' '
0536:                                    && c != '-')
0537:                                break syntax;
0538:                            else if (hour >= 0 && min < 0)
0539:                                min = (byte) n;
0540:                            else if (min >= 0 && sec < 0)
0541:                                sec = (byte) n;
0542:                            else if (mday < 0)
0543:                                mday = (byte) n;
0544:                            // Handle two-digit years < 70 (70-99 handled above).
0545:                            else if (year == Integer.MIN_VALUE && mon >= 0
0546:                                    && mday >= 0)
0547:                                year = n;
0548:                            else
0549:                                break syntax;
0550:                            prevc = 0;
0551:                        } else if (c == '/' || c == ':' || c == '+' || c == '-')
0552:                            prevc = c;
0553:                        else {
0554:                            int st = i - 1;
0555:                            while (i < limit) {
0556:                                c = s.charAt(i);
0557:                                if (!('A' <= c && c <= 'Z' || 'a' <= c
0558:                                        && c <= 'z'))
0559:                                    break;
0560:                                i++;
0561:                            }
0562:                            if (i <= st + 1)
0563:                                break syntax;
0564:                            int k;
0565:                            for (k = wtb.length; --k >= 0;)
0566:                                if (wtb[k]
0567:                                        .regionMatches(true, 0, s, st, i - st)) {
0568:                                    int action = ttb[k];
0569:                                    if (action != 0) {
0570:                                        if (action == 1) { // pm
0571:                                            if (hour > 12 || hour < 1)
0572:                                                break syntax;
0573:                                            else if (hour < 12)
0574:                                                hour += 12;
0575:                                        } else if (action == 14) { // am
0576:                                            if (hour > 12 || hour < 1)
0577:                                                break syntax;
0578:                                            else if (hour == 12)
0579:                                                hour = 0;
0580:                                        } else if (action <= 13) { // month!
0581:                                            if (mon < 0)
0582:                                                mon = (byte) (action - 2);
0583:                                            else
0584:                                                break syntax;
0585:                                        } else {
0586:                                            tzoffset = action - 10000;
0587:                                        }
0588:                                    }
0589:                                    break;
0590:                                }
0591:                            if (k < 0)
0592:                                break syntax;
0593:                            prevc = 0;
0594:                        }
0595:                    }
0596:                    if (year == Integer.MIN_VALUE || mon < 0 || mday < 0)
0597:                        break syntax;
0598:                    // Parse 2-digit years within the correct default century.
0599:                    if (year < 100) {
0600:                        synchronized (Date.class) {
0601:                            if (defaultCenturyStart == 0) {
0602:                                defaultCenturyStart = gcal.getCalendarDate()
0603:                                        .getYear() - 80;
0604:                            }
0605:                        }
0606:                        year += (defaultCenturyStart / 100) * 100;
0607:                        if (year < defaultCenturyStart)
0608:                            year += 100;
0609:                    }
0610:                    if (sec < 0)
0611:                        sec = 0;
0612:                    if (min < 0)
0613:                        min = 0;
0614:                    if (hour < 0)
0615:                        hour = 0;
0616:                    BaseCalendar cal = getCalendarSystem(year);
0617:                    if (tzoffset == -1) { // no time zone specified, have to use local
0618:                        BaseCalendar.Date ldate = (BaseCalendar.Date) cal
0619:                                .newCalendarDate(TimeZone.getDefaultRef());
0620:                        ldate.setDate(year, mon + 1, mday);
0621:                        ldate.setTimeOfDay(hour, min, sec, 0);
0622:                        return cal.getTime(ldate);
0623:                    }
0624:                    BaseCalendar.Date udate = (BaseCalendar.Date) cal
0625:                            .newCalendarDate(null); // no time zone
0626:                    udate.setDate(year, mon + 1, mday);
0627:                    udate.setTimeOfDay(hour, min, sec, 0);
0628:                    return cal.getTime(udate) + tzoffset * (60 * 1000);
0629:                }
0630:                // syntax error
0631:                throw new IllegalArgumentException();
0632:            }
0633:
0634:            private final static String wtb[] = { "am", "pm", "monday",
0635:                    "tuesday", "wednesday", "thursday", "friday", "saturday",
0636:                    "sunday", "january", "february", "march", "april", "may",
0637:                    "june", "july", "august", "september", "october",
0638:                    "november", "december", "gmt", "ut", "utc", "est", "edt",
0639:                    "cst", "cdt", "mst", "mdt", "pst", "pdt" };
0640:            private final static int ttb[] = { 14, 1, 0, 0, 0, 0, 0, 0, 0, 2,
0641:                    3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 10000 + 0, 10000 + 0,
0642:                    10000 + 0, // GMT/UT/UTC
0643:                    10000 + 5 * 60, 10000 + 4 * 60, // EST/EDT
0644:                    10000 + 6 * 60, 10000 + 5 * 60, // CST/CDT
0645:                    10000 + 7 * 60, 10000 + 6 * 60, // MST/MDT
0646:                    10000 + 8 * 60, 10000 + 7 * 60 // PST/PDT
0647:            };
0648:
0649:            /**
0650:             * Returns a value that is the result of subtracting 1900 from the 
0651:             * year that contains or begins with the instant in time represented 
0652:             * by this <code>Date</code> object, as interpreted in the local 
0653:             * time zone.
0654:             *
0655:             * @return  the year represented by this date, minus 1900.
0656:             * @see     java.util.Calendar
0657:             * @deprecated As of JDK version 1.1,
0658:             * replaced by <code>Calendar.get(Calendar.YEAR) - 1900</code>.
0659:             */
0660:            @Deprecated
0661:            public int getYear() {
0662:                return normalize().getYear() - 1900;
0663:            }
0664:
0665:            /**
0666:             * Sets the year of this <tt>Date</tt> object to be the specified 
0667:             * value plus 1900. This <code>Date</code> object is modified so 
0668:             * that it represents a point in time within the specified year, 
0669:             * with the month, date, hour, minute, and second the same as 
0670:             * before, as interpreted in the local time zone. (Of course, if 
0671:             * the date was February 29, for example, and the year is set to a 
0672:             * non-leap year, then the new date will be treated as if it were 
0673:             * on March 1.)
0674:             *
0675:             * @param   year    the year value.
0676:             * @see     java.util.Calendar
0677:             * @deprecated As of JDK version 1.1,
0678:             * replaced by <code>Calendar.set(Calendar.YEAR, year + 1900)</code>.
0679:             */
0680:            @Deprecated
0681:            public void setYear(int year) {
0682:                getCalendarDate().setNormalizedYear(year + 1900);
0683:            }
0684:
0685:            /**
0686:             * Returns a number representing the month that contains or begins 
0687:             * with the instant in time represented by this <tt>Date</tt> object. 
0688:             * The value returned is between <code>0</code> and <code>11</code>, 
0689:             * with the value <code>0</code> representing January.
0690:             *
0691:             * @return  the month represented by this date.
0692:             * @see     java.util.Calendar
0693:             * @deprecated As of JDK version 1.1,
0694:             * replaced by <code>Calendar.get(Calendar.MONTH)</code>.
0695:             */
0696:            @Deprecated
0697:            public int getMonth() {
0698:                return normalize().getMonth() - 1; // adjust 1-based to 0-based
0699:            }
0700:
0701:            /**
0702:             * Sets the month of this date to the specified value. This 
0703:             * <tt>Date</tt> object is modified so that it represents a point 
0704:             * in time within the specified month, with the year, date, hour, 
0705:             * minute, and second the same as before, as interpreted in the 
0706:             * local time zone. If the date was October 31, for example, and 
0707:             * the month is set to June, then the new date will be treated as 
0708:             * if it were on July 1, because June has only 30 days.
0709:             *
0710:             * @param   month   the month value between 0-11.
0711:             * @see     java.util.Calendar
0712:             * @deprecated As of JDK version 1.1,
0713:             * replaced by <code>Calendar.set(Calendar.MONTH, int month)</code>.
0714:             */
0715:            @Deprecated
0716:            public void setMonth(int month) {
0717:                int y = 0;
0718:                if (month >= 12) {
0719:                    y = month / 12;
0720:                    month %= 12;
0721:                } else if (month < 0) {
0722:                    y = CalendarUtils.floorDivide(month, 12);
0723:                    month = CalendarUtils.mod(month, 12);
0724:                }
0725:                BaseCalendar.Date d = getCalendarDate();
0726:                if (y != 0) {
0727:                    d.setNormalizedYear(d.getNormalizedYear() + y);
0728:                }
0729:                d.setMonth(month + 1); // adjust 0-based to 1-based month numbering
0730:            }
0731:
0732:            /**
0733:             * Returns the day of the month represented by this <tt>Date</tt> object. 
0734:             * The value returned is between <code>1</code> and <code>31</code> 
0735:             * representing the day of the month that contains or begins with the 
0736:             * instant in time represented by this <tt>Date</tt> object, as 
0737:             * interpreted in the local time zone.
0738:             *
0739:             * @return  the day of the month represented by this date.
0740:             * @see     java.util.Calendar
0741:             * @deprecated As of JDK version 1.1,
0742:             * replaced by <code>Calendar.get(Calendar.DAY_OF_MONTH)</code>.
0743:             * @deprecated
0744:             */
0745:            @Deprecated
0746:            public int getDate() {
0747:                return normalize().getDayOfMonth();
0748:            }
0749:
0750:            /**
0751:             * Sets the day of the month of this <tt>Date</tt> object to the 
0752:             * specified value. This <tt>Date</tt> object is modified so that 
0753:             * it represents a point in time within the specified day of the 
0754:             * month, with the year, month, hour, minute, and second the same 
0755:             * as before, as interpreted in the local time zone. If the date 
0756:             * was April 30, for example, and the date is set to 31, then it 
0757:             * will be treated as if it were on May 1, because April has only 
0758:             * 30 days.
0759:             *
0760:             * @param   date   the day of the month value between 1-31.
0761:             * @see     java.util.Calendar
0762:             * @deprecated As of JDK version 1.1,
0763:             * replaced by <code>Calendar.set(Calendar.DAY_OF_MONTH, int date)</code>.
0764:             */
0765:            @Deprecated
0766:            public void setDate(int date) {
0767:                getCalendarDate().setDayOfMonth(date);
0768:            }
0769:
0770:            /**
0771:             * Returns the day of the week represented by this date. The 
0772:             * returned value (<tt>0</tt> = Sunday, <tt>1</tt> = Monday, 
0773:             * <tt>2</tt> = Tuesday, <tt>3</tt> = Wednesday, <tt>4</tt> = 
0774:             * Thursday, <tt>5</tt> = Friday, <tt>6</tt> = Saturday) 
0775:             * represents the day of the week that contains or begins with 
0776:             * the instant in time represented by this <tt>Date</tt> object, 
0777:             * as interpreted in the local time zone.
0778:             *
0779:             * @return  the day of the week represented by this date.
0780:             * @see     java.util.Calendar
0781:             * @deprecated As of JDK version 1.1,
0782:             * replaced by <code>Calendar.get(Calendar.DAY_OF_WEEK)</code>.
0783:             */
0784:            @Deprecated
0785:            public int getDay() {
0786:                return normalize().getDayOfWeek() - gcal.SUNDAY;
0787:            }
0788:
0789:            /**
0790:             * Returns the hour represented by this <tt>Date</tt> object. The 
0791:             * returned value is a number (<tt>0</tt> through <tt>23</tt>) 
0792:             * representing the hour within the day that contains or begins 
0793:             * with the instant in time represented by this <tt>Date</tt> 
0794:             * object, as interpreted in the local time zone.
0795:             *
0796:             * @return  the hour represented by this date.
0797:             * @see     java.util.Calendar
0798:             * @deprecated As of JDK version 1.1,
0799:             * replaced by <code>Calendar.get(Calendar.HOUR_OF_DAY)</code>.
0800:             */
0801:            @Deprecated
0802:            public int getHours() {
0803:                return normalize().getHours();
0804:            }
0805:
0806:            /**
0807:             * Sets the hour of this <tt>Date</tt> object to the specified value. 
0808:             * This <tt>Date</tt> object is modified so that it represents a point 
0809:             * in time within the specified hour of the day, with the year, month, 
0810:             * date, minute, and second the same as before, as interpreted in the 
0811:             * local time zone.
0812:             *
0813:             * @param   hours   the hour value.
0814:             * @see     java.util.Calendar
0815:             * @deprecated As of JDK version 1.1,
0816:             * replaced by <code>Calendar.set(Calendar.HOUR_OF_DAY, int hours)</code>.
0817:             */
0818:            @Deprecated
0819:            public void setHours(int hours) {
0820:                getCalendarDate().setHours(hours);
0821:            }
0822:
0823:            /**
0824:             * Returns the number of minutes past the hour represented by this date, 
0825:             * as interpreted in the local time zone. 
0826:             * The value returned is between <code>0</code> and <code>59</code>.
0827:             *
0828:             * @return  the number of minutes past the hour represented by this date.
0829:             * @see     java.util.Calendar
0830:             * @deprecated As of JDK version 1.1,
0831:             * replaced by <code>Calendar.get(Calendar.MINUTE)</code>.
0832:             */
0833:            @Deprecated
0834:            public int getMinutes() {
0835:                return normalize().getMinutes();
0836:            }
0837:
0838:            /**
0839:             * Sets the minutes of this <tt>Date</tt> object to the specified value. 
0840:             * This <tt>Date</tt> object is modified so that it represents a point 
0841:             * in time within the specified minute of the hour, with the year, month, 
0842:             * date, hour, and second the same as before, as interpreted in the 
0843:             * local time zone.
0844:             *
0845:             * @param   minutes   the value of the minutes.
0846:             * @see     java.util.Calendar
0847:             * @deprecated As of JDK version 1.1,
0848:             * replaced by <code>Calendar.set(Calendar.MINUTE, int minutes)</code>.
0849:             */
0850:            @Deprecated
0851:            public void setMinutes(int minutes) {
0852:                getCalendarDate().setMinutes(minutes);
0853:            }
0854:
0855:            /**
0856:             * Returns the number of seconds past the minute represented by this date.
0857:             * The value returned is between <code>0</code> and <code>61</code>. The
0858:             * values <code>60</code> and <code>61</code> can only occur on those 
0859:             * Java Virtual Machines that take leap seconds into account.
0860:             *
0861:             * @return  the number of seconds past the minute represented by this date.
0862:             * @see     java.util.Calendar
0863:             * @deprecated As of JDK version 1.1,
0864:             * replaced by <code>Calendar.get(Calendar.SECOND)</code>.
0865:             */
0866:            @Deprecated
0867:            public int getSeconds() {
0868:                return normalize().getSeconds();
0869:            }
0870:
0871:            /**
0872:             * Sets the seconds of this <tt>Date</tt> to the specified value. 
0873:             * This <tt>Date</tt> object is modified so that it represents a 
0874:             * point in time within the specified second of the minute, with 
0875:             * the year, month, date, hour, and minute the same as before, as 
0876:             * interpreted in the local time zone.
0877:             *
0878:             * @param   seconds   the seconds value.
0879:             * @see     java.util.Calendar
0880:             * @deprecated As of JDK version 1.1,
0881:             * replaced by <code>Calendar.set(Calendar.SECOND, int seconds)</code>. 
0882:             */
0883:            @Deprecated
0884:            public void setSeconds(int seconds) {
0885:                getCalendarDate().setSeconds(seconds);
0886:            }
0887:
0888:            /**
0889:             * Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT
0890:             * represented by this <tt>Date</tt> object.
0891:             *
0892:             * @return  the number of milliseconds since January 1, 1970, 00:00:00 GMT
0893:             *          represented by this date.
0894:             */
0895:            public long getTime() {
0896:                return getTimeImpl();
0897:            }
0898:
0899:            private final long getTimeImpl() {
0900:                if (cdate != null && !cdate.isNormalized()) {
0901:                    normalize();
0902:                }
0903:                return fastTime;
0904:            }
0905:
0906:            /**
0907:             * Sets this <code>Date</code> object to represent a point in time that is 
0908:             * <code>time</code> milliseconds after January 1, 1970 00:00:00 GMT. 
0909:             *
0910:             * @param   time   the number of milliseconds.
0911:             */
0912:            public void setTime(long time) {
0913:                fastTime = time;
0914:                cdate = null;
0915:            }
0916:
0917:            /**
0918:             * Tests if this date is before the specified date.
0919:             *
0920:             * @param   when   a date.
0921:             * @return  <code>true</code> if and only if the instant of time 
0922:             *            represented by this <tt>Date</tt> object is strictly 
0923:             *            earlier than the instant represented by <tt>when</tt>;
0924:             *          <code>false</code> otherwise.
0925:             * @exception NullPointerException if <code>when</code> is null.
0926:             */
0927:            public boolean before(Date when) {
0928:                return getMillisOf(this ) < getMillisOf(when);
0929:            }
0930:
0931:            /**
0932:             * Tests if this date is after the specified date.
0933:             *
0934:             * @param   when   a date.
0935:             * @return  <code>true</code> if and only if the instant represented 
0936:             *          by this <tt>Date</tt> object is strictly later than the 
0937:             *          instant represented by <tt>when</tt>; 
0938:             *          <code>false</code> otherwise.
0939:             * @exception NullPointerException if <code>when</code> is null.
0940:             */
0941:            public boolean after(Date when) {
0942:                return getMillisOf(this ) > getMillisOf(when);
0943:            }
0944:
0945:            /**
0946:             * Compares two dates for equality.
0947:             * The result is <code>true</code> if and only if the argument is 
0948:             * not <code>null</code> and is a <code>Date</code> object that 
0949:             * represents the same point in time, to the millisecond, as this object.
0950:             * <p>
0951:             * Thus, two <code>Date</code> objects are equal if and only if the 
0952:             * <code>getTime</code> method returns the same <code>long</code> 
0953:             * value for both. 
0954:             *
0955:             * @param   obj   the object to compare with.
0956:             * @return  <code>true</code> if the objects are the same;
0957:             *          <code>false</code> otherwise.
0958:             * @see     java.util.Date#getTime()
0959:             */
0960:            public boolean equals(Object obj) {
0961:                return obj instanceof  Date
0962:                        && getTime() == ((Date) obj).getTime();
0963:            }
0964:
0965:            /**
0966:             * Returns the millisecond value of this <code>Date</code> object
0967:             * without affecting its internal state.
0968:             */
0969:            static final long getMillisOf(Date date) {
0970:                if (date.cdate == null) {
0971:                    return date.fastTime;
0972:                }
0973:                BaseCalendar.Date d = (BaseCalendar.Date) date.cdate.clone();
0974:                return gcal.getTime(d);
0975:            }
0976:
0977:            /**
0978:             * Compares two Dates for ordering.
0979:             *
0980:             * @param   anotherDate   the <code>Date</code> to be compared.
0981:             * @return  the value <code>0</code> if the argument Date is equal to
0982:             *          this Date; a value less than <code>0</code> if this Date
0983:             *          is before the Date argument; and a value greater than
0984:             *      <code>0</code> if this Date is after the Date argument.
0985:             * @since   1.2
0986:             * @exception NullPointerException if <code>anotherDate</code> is null.
0987:             */
0988:            public int compareTo(Date anotherDate) {
0989:                long this Time = getMillisOf(this );
0990:                long anotherTime = getMillisOf(anotherDate);
0991:                return (this Time < anotherTime ? -1
0992:                        : (this Time == anotherTime ? 0 : 1));
0993:            }
0994:
0995:            /**
0996:             * Returns a hash code value for this object. The result is the 
0997:             * exclusive OR of the two halves of the primitive <tt>long</tt> 
0998:             * value returned by the {@link Date#getTime} 
0999:             * method. That is, the hash code is the value of the expression:
1000:             * <blockquote><pre>
1001:             * (int)(this.getTime()^(this.getTime() >>> 32))</pre></blockquote>
1002:             *
1003:             * @return  a hash code value for this object. 
1004:             */
1005:            public int hashCode() {
1006:                long ht = this .getTime();
1007:                return (int) ht ^ (int) (ht >> 32);
1008:            }
1009:
1010:            /**
1011:             * Converts this <code>Date</code> object to a <code>String</code> 
1012:             * of the form:
1013:             * <blockquote><pre>
1014:             * dow mon dd hh:mm:ss zzz yyyy</pre></blockquote>
1015:             * where:<ul>
1016:             * <li><tt>dow</tt> is the day of the week (<tt>Sun, Mon, Tue, Wed, 
1017:             *     Thu, Fri, Sat</tt>).
1018:             * <li><tt>mon</tt> is the month (<tt>Jan, Feb, Mar, Apr, May, Jun, 
1019:             *     Jul, Aug, Sep, Oct, Nov, Dec</tt>).
1020:             * <li><tt>dd</tt> is the day of the month (<tt>01</tt> through 
1021:             *     <tt>31</tt>), as two decimal digits.
1022:             * <li><tt>hh</tt> is the hour of the day (<tt>00</tt> through 
1023:             *     <tt>23</tt>), as two decimal digits.
1024:             * <li><tt>mm</tt> is the minute within the hour (<tt>00</tt> through 
1025:             *     <tt>59</tt>), as two decimal digits.
1026:             * <li><tt>ss</tt> is the second within the minute (<tt>00</tt> through 
1027:             *     <tt>61</tt>, as two decimal digits.
1028:             * <li><tt>zzz</tt> is the time zone (and may reflect daylight saving 
1029:             *     time). Standard time zone abbreviations include those 
1030:             *     recognized by the method <tt>parse</tt>. If time zone 
1031:             *     information is not available, then <tt>zzz</tt> is empty - 
1032:             *     that is, it consists of no characters at all.
1033:             * <li><tt>yyyy</tt> is the year, as four decimal digits.
1034:             * </ul>
1035:             *
1036:             * @return  a string representation of this date. 
1037:             * @see     java.util.Date#toLocaleString()
1038:             * @see     java.util.Date#toGMTString()
1039:             */
1040:            public String toString() {
1041:                // "EEE MMM dd HH:mm:ss zzz yyyy";
1042:                BaseCalendar.Date date = normalize();
1043:                StringBuilder sb = new StringBuilder(28);
1044:                int index = date.getDayOfWeek();
1045:                if (index == gcal.SUNDAY) {
1046:                    index = 8;
1047:                }
1048:                convertToAbbr(sb, wtb[index]).append(' '); // EEE
1049:                convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' '); // MMM
1050:                CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2)
1051:                        .append(' '); // dd
1052:
1053:                CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':'); // HH
1054:                CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':'); // mm
1055:                CalendarUtils.sprintf0d(sb, date.getSeconds(), 2).append(' '); // ss
1056:                TimeZone zi = date.getZone();
1057:                if (zi != null) {
1058:                    sb.append(zi.getDisplayName(date.isDaylightTime(),
1059:                            zi.SHORT, Locale.US)); // zzz
1060:                } else {
1061:                    sb.append("GMT");
1062:                }
1063:                sb.append(' ').append(date.getYear()); // yyyy
1064:                return sb.toString();
1065:            }
1066:
1067:            /**
1068:             * Converts the given name to its 3-letter abbreviation (e.g.,
1069:             * "monday" -> "Mon") and stored the abbreviation in the given
1070:             * <code>StringBuilder</code>.
1071:             */
1072:            private static final StringBuilder convertToAbbr(StringBuilder sb,
1073:                    String name) {
1074:                sb.append(Character.toUpperCase(name.charAt(0)));
1075:                sb.append(name.charAt(1)).append(name.charAt(2));
1076:                return sb;
1077:            }
1078:
1079:            /**
1080:             * Creates a string representation of this <tt>Date</tt> object in an 
1081:             * implementation-dependent form. The intent is that the form should 
1082:             * be familiar to the user of the Java application, wherever it may 
1083:             * happen to be running. The intent is comparable to that of the 
1084:             * "<code>%c</code>" format supported by the <code>strftime()</code> 
1085:             * function of ISO&nbsp;C. 
1086:             *
1087:             * @return  a string representation of this date, using the locale
1088:             *          conventions.
1089:             * @see     java.text.DateFormat
1090:             * @see     java.util.Date#toString()
1091:             * @see     java.util.Date#toGMTString()
1092:             * @deprecated As of JDK version 1.1,
1093:             * replaced by <code>DateFormat.format(Date date)</code>.
1094:             */
1095:            @Deprecated
1096:            public String toLocaleString() {
1097:                DateFormat formatter = DateFormat.getDateTimeInstance();
1098:                return formatter.format(this );
1099:            }
1100:
1101:            /**
1102:             * Creates a string representation of this <tt>Date</tt> object of 
1103:             * the form:
1104:             * <blockquote<pre>
1105:             * d mon yyyy hh:mm:ss GMT</pre></blockquote>
1106:             * where:<ul>
1107:             * <li><i>d</i> is the day of the month (<tt>1</tt> through <tt>31</tt>), 
1108:             *     as one or two decimal digits.
1109:             * <li><i>mon</i> is the month (<tt>Jan, Feb, Mar, Apr, May, Jun, Jul, 
1110:             *     Aug, Sep, Oct, Nov, Dec</tt>).
1111:             * <li><i>yyyy</i> is the year, as four decimal digits.
1112:             * <li><i>hh</i> is the hour of the day (<tt>00</tt> through <tt>23</tt>), 
1113:             *     as two decimal digits.
1114:             * <li><i>mm</i> is the minute within the hour (<tt>00</tt> through 
1115:             *     <tt>59</tt>), as two decimal digits.
1116:             * <li><i>ss</i> is the second within the minute (<tt>00</tt> through 
1117:             *     <tt>61</tt>), as two decimal digits.
1118:             * <li><i>GMT</i> is exactly the ASCII letters "<tt>GMT</tt>" to indicate 
1119:             *     Greenwich Mean Time.
1120:             * </ul><p>
1121:             * The result does not depend on the local time zone.
1122:             * 
1123:             * @return  a string representation of this date, using the Internet GMT
1124:             *          conventions.
1125:             * @see     java.text.DateFormat
1126:             * @see     java.util.Date#toString()
1127:             * @see     java.util.Date#toLocaleString()
1128:             * @deprecated As of JDK version 1.1,
1129:             * replaced by <code>DateFormat.format(Date date)</code>, using a
1130:             * GMT <code>TimeZone</code>.
1131:             */
1132:            @Deprecated
1133:            public String toGMTString() {
1134:                // d MMM yyyy HH:mm:ss 'GMT'
1135:                long t = getTime();
1136:                BaseCalendar cal = getCalendarSystem(t);
1137:                BaseCalendar.Date date = (BaseCalendar.Date) cal
1138:                        .getCalendarDate(getTime(), (TimeZone) null);
1139:                StringBuilder sb = new StringBuilder(32);
1140:                CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 1)
1141:                        .append(' '); // d
1142:                convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' '); // MMM
1143:                sb.append(date.getYear()).append(' '); // yyyy
1144:                CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':'); // HH
1145:                CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':'); // mm
1146:                CalendarUtils.sprintf0d(sb, date.getSeconds(), 2); // ss
1147:                sb.append(" GMT"); // ' GMT'
1148:                return sb.toString();
1149:            }
1150:
1151:            /**
1152:             * Returns the offset, measured in minutes, for the local time zone 
1153:             * relative to UTC that is appropriate for the time represented by 
1154:             * this <code>Date</code> object. 
1155:             * <p>
1156:             * For example, in Massachusetts, five time zones west of Greenwich:
1157:             * <blockquote><pre>
1158:             * new Date(96, 1, 14).getTimezoneOffset() returns 300</pre></blockquote>
1159:             * because on February 14, 1996, standard time (Eastern Standard Time) 
1160:             * is in use, which is offset five hours from UTC; but:
1161:             * <blockquote><pre>
1162:             * new Date(96, 5, 1).getTimezoneOffset() returns 240</pre></blockquote>
1163:             * because on June 1, 1996, daylight saving time (Eastern Daylight Time) 
1164:             * is in use, which is offset only four hours from UTC.<p>
1165:             * This method produces the same result as if it computed:
1166:             * <blockquote><pre>
1167:             * (this.getTime() - UTC(this.getYear(), 
1168:             *                       this.getMonth(), 
1169:             *                       this.getDate(),
1170:             *                       this.getHours(), 
1171:             *                       this.getMinutes(), 
1172:             *                       this.getSeconds())) / (60 * 1000)
1173:             * </pre></blockquote>
1174:             *
1175:             * @return  the time-zone offset, in minutes, for the current time zone.
1176:             * @see     java.util.Calendar#ZONE_OFFSET
1177:             * @see     java.util.Calendar#DST_OFFSET
1178:             * @see     java.util.TimeZone#getDefault
1179:             * @deprecated As of JDK version 1.1,
1180:             * replaced by <code>-(Calendar.get(Calendar.ZONE_OFFSET) +
1181:             * Calendar.get(Calendar.DST_OFFSET)) / (60 * 1000)</code>.
1182:             */
1183:            @Deprecated
1184:            public int getTimezoneOffset() {
1185:                int zoneOffset;
1186:                if (cdate == null) {
1187:                    TimeZone tz = TimeZone.getDefaultRef();
1188:                    if (tz instanceof  ZoneInfo) {
1189:                        zoneOffset = ((ZoneInfo) tz).getOffsets(fastTime, null);
1190:                    } else {
1191:                        zoneOffset = tz.getOffset(fastTime);
1192:                    }
1193:                } else {
1194:                    normalize();
1195:                    zoneOffset = cdate.getZoneOffset();
1196:                }
1197:                return -zoneOffset / 60000; // convert to minutes
1198:            }
1199:
1200:            private final BaseCalendar.Date getCalendarDate() {
1201:                if (cdate == null) {
1202:                    BaseCalendar cal = getCalendarSystem(fastTime);
1203:                    cdate = (BaseCalendar.Date) cal.getCalendarDate(fastTime,
1204:                            TimeZone.getDefaultRef());
1205:                }
1206:                return cdate;
1207:            }
1208:
1209:            private final BaseCalendar.Date normalize() {
1210:                if (cdate == null) {
1211:                    BaseCalendar cal = getCalendarSystem(fastTime);
1212:                    cdate = (BaseCalendar.Date) cal.getCalendarDate(fastTime,
1213:                            TimeZone.getDefaultRef());
1214:                    return cdate;
1215:                }
1216:
1217:                // Normalize cdate with the TimeZone in cdate first. This is
1218:                // required for the compatible behavior.
1219:                if (!cdate.isNormalized()) {
1220:                    cdate = normalize(cdate);
1221:                }
1222:
1223:                // If the default TimeZone has changed, then recalculate the
1224:                // fields with the new TimeZone.
1225:                TimeZone tz = TimeZone.getDefaultRef();
1226:                if (tz != cdate.getZone()) {
1227:                    cdate.setZone(tz);
1228:                    CalendarSystem cal = getCalendarSystem(cdate);
1229:                    cal.getCalendarDate(fastTime, cdate);
1230:                }
1231:                return cdate;
1232:            }
1233:
1234:            // fastTime and the returned data are in sync upon return.
1235:            private final BaseCalendar.Date normalize(BaseCalendar.Date date) {
1236:                int y = date.getNormalizedYear();
1237:                int m = date.getMonth();
1238:                int d = date.getDayOfMonth();
1239:                int hh = date.getHours();
1240:                int mm = date.getMinutes();
1241:                int ss = date.getSeconds();
1242:                int ms = date.getMillis();
1243:                TimeZone tz = date.getZone();
1244:
1245:                // If the specified year can't be handled using a long value
1246:                // in milliseconds, GregorianCalendar is used for full
1247:                // compatibility with underflow and overflow. This is required
1248:                // by some JCK tests. The limits are based max year values -
1249:                // years that can be represented by max values of d, hh, mm,
1250:                // ss and ms. Also, let GregorianCalendar handle the default
1251:                // cutover year so that we don't need to worry about the
1252:                // transition here.
1253:                if (y == 1582 || y > 280000000 || y < -280000000) {
1254:                    if (tz == null) {
1255:                        tz = TimeZone.getTimeZone("GMT");
1256:                    }
1257:                    GregorianCalendar gc = new GregorianCalendar(tz);
1258:                    gc.clear();
1259:                    gc.set(gc.MILLISECOND, ms);
1260:                    gc.set(y, m - 1, d, hh, mm, ss);
1261:                    fastTime = gc.getTimeInMillis();
1262:                    BaseCalendar cal = getCalendarSystem(fastTime);
1263:                    date = (BaseCalendar.Date) cal
1264:                            .getCalendarDate(fastTime, tz);
1265:                    return date;
1266:                }
1267:
1268:                BaseCalendar cal = getCalendarSystem(y);
1269:                if (cal != getCalendarSystem(date)) {
1270:                    date = (BaseCalendar.Date) cal.newCalendarDate(tz);
1271:                    date.setNormalizedDate(y, m, d)
1272:                            .setTimeOfDay(hh, mm, ss, ms);
1273:                }
1274:                // Perform the GregorianCalendar-style normalization.
1275:                fastTime = cal.getTime(date);
1276:
1277:                // In case the normalized date requires the other calendar
1278:                // system, we need to recalculate it using the other one.
1279:                BaseCalendar ncal = getCalendarSystem(fastTime);
1280:                if (ncal != cal) {
1281:                    date = (BaseCalendar.Date) ncal.newCalendarDate(tz);
1282:                    date.setNormalizedDate(y, m, d)
1283:                            .setTimeOfDay(hh, mm, ss, ms);
1284:                    fastTime = ncal.getTime(date);
1285:                }
1286:                return date;
1287:            }
1288:
1289:            /**
1290:             * Returns the Gregorian or Julian calendar system to use with the
1291:             * given date. Use Gregorian from October 15, 1582.
1292:             *
1293:             * @param year normalized calendar year (not -1900)
1294:             * @return the CalendarSystem to use for the specified date
1295:             */
1296:            private static final BaseCalendar getCalendarSystem(int year) {
1297:                if (year >= 1582) {
1298:                    return gcal;
1299:                }
1300:                return getJulianCalendar();
1301:            }
1302:
1303:            private static final BaseCalendar getCalendarSystem(long utc) {
1304:                // Quickly check if the time stamp given by `utc' is the Epoch
1305:                // or later. If it's before 1970, we convert the cutover to
1306:                // local time to compare.
1307:                if (utc >= 0
1308:                        || utc >= GregorianCalendar.DEFAULT_GREGORIAN_CUTOVER
1309:                                - TimeZone.getDefaultRef().getOffset(utc)) {
1310:                    return gcal;
1311:                }
1312:                return getJulianCalendar();
1313:            }
1314:
1315:            private static final BaseCalendar getCalendarSystem(
1316:                    BaseCalendar.Date cdate) {
1317:                if (jcal == null) {
1318:                    return gcal;
1319:                }
1320:                if (cdate.getEra() != null) {
1321:                    return jcal;
1322:                }
1323:                return gcal;
1324:            }
1325:
1326:            synchronized private static final BaseCalendar getJulianCalendar() {
1327:                if (jcal == null) {
1328:                    jcal = (BaseCalendar) CalendarSystem.forName("julian");
1329:                }
1330:                return jcal;
1331:            }
1332:
1333:            /**
1334:             * Save the state of this object to a stream (i.e., serialize it).
1335:             *
1336:             * @serialData The value returned by <code>getTime()</code>
1337:             *		   is emitted (long).  This represents the offset from
1338:             *             January 1, 1970, 00:00:00 GMT in milliseconds.
1339:             */
1340:            private void writeObject(ObjectOutputStream s) throws IOException {
1341:                s.writeLong(getTimeImpl());
1342:            }
1343:
1344:            /**
1345:             * Reconstitute this object from a stream (i.e., deserialize it).
1346:             */
1347:            private void readObject(ObjectInputStream s) throws IOException,
1348:                    ClassNotFoundException {
1349:                fastTime = s.readLong();
1350:            }
1351:        }
ww___w___.___j_a___v_a_2_s_.__co__m | Contact Us
Copyright 2003 - 08 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.