date.java
来自「《移动Agent技术》一书的所有章节源代码。」· Java 代码 · 共 899 行 · 第 1/3 页
JAVA
899 行
/*
* @(#)Date.java 1.49 98/07/01
*
* Copyright 1995-1998 by Sun Microsystems, Inc.,
* 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
* All rights reserved.
*
* This software is the confidential and proprietary information
* of Sun Microsystems, Inc. ("Confidential Information"). You
* shall not disclose such Confidential Information and shall use
* it only in accordance with the terms of the license agreement
* you entered into with Sun.
*/
package java.util;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
/**
* The class <code>Date</code> represents a specific instant
* in time, with millisecond precision.
* <p>
* Prior to JDK 1.1, the class <code>Date</code> had two additional
* functions. It allowed the interpretation of dates as year, month, day, hour,
* minute, and second values. It also allowed the formatting and parsing
* of date strings. Unfortunately, the API for these functions was not
* amenable to internationalization. As of JDK 1.1, the
* <code>Calendar</code> class should be used to convert between dates and time
* fields and the <code>DateFormat</code> class should be used to format and
* parse date strings.
* The corresponding methods in <code>Date</code> are deprecated.
* <p>
* Although the <code>Date</code> class is intended to reflect
* coordinated universal time (UTC), it may not do so exactly,
* depending on the host environment of the Java Virtual Machine.
* Nearly all modern operating systems assume that 1 day =
* 24 × 60 × 60 = 86400 seconds
* in all cases. In UTC, however, about once every year or two there
* is an extra second, called a "leap second." The leap
* second is always added as the last second of the day, and always
* on December 31 or June 30. For example, the last minute of the
* year 1995 was 61 seconds long, thanks to an added leap second.
* Most computer clocks are not accurate enough to be able to reflect
* the leap-second distinction.
* <p>
* Some computer standards are defined in terms of Greenwich mean
* time (GMT), which is equivalent to universal time (UT). GMT is
* the "civil" name for the standard; UT is the
* "scientific" name for the same standard. The
* distinction between UTC and UT is that UTC is based on an atomic
* clock and UT is based on astronomical observations, which for all
* practical purposes is an invisibly fine hair to split. Because the
* earth's rotation is not uniform (it slows down and speeds up
* in complicated ways), UT does not always flow uniformly. Leap
* seconds are introduced as needed into UTC so as to keep UTC within
* 0.9 seconds of UT1, which is a version of UT with certain
* corrections applied. There are other time and date systems as
* well; for example, the time scale used by the satellite-based
* global positioning system (GPS) is synchronized to UTC but is
* <i>not</i> adjusted for leap seconds. An interesting source of
* further information is the U.S. Naval Observatory, particularly
* the Directorate of Time at:
* <ul><code>
* http://tycho.usno.navy.mil
* </code></ul>
* <p>
* and their definitions of "Systems of Time" at:
* <ul><code>http://tycho.usno.navy.mil/systime.html
* </code></ul>
* <p>
* In all methods of class <code>Date</code> that accept or return
* year, month, date, hours, minutes, and seconds values, the
* following representations are used:
* <ul>
* <li>A year <i>y</i> is represented by the integer
* <i>y</i> <code>- 1900</code>.
* <li>A month is represented by an integer form 0 to 11; 0 is January,
* 1 is February, and so forth; thus 11 is December.
* <li>A date (day of month) is represented by an integer from 1 to 31
* in the usual manner.
* <li>An hour is represented by an integer from 0 to 23. Thus, the hour
* from midnight to 1 a.m. is hour 0, and the hour from noon to 1
* p.m. is hour 12.
* <li>A minute is represented by an integer from 0 to 59 in the usual manner.
* <li>A second is represented by an integer from 0 to 60; the value 60 occurs
* only for leap seconds and even then only in Java implementations that
* actually track leap seconds correctly.
* </ul>
* <p>
* In all cases, arguments given to methods for these purposes need
* not fall within the indicated ranges; for example, a date may be
* specified as January 32 and is interpreted as meaning February 1.
*
* @author James Gosling
* @author Arthur van Hoff
* @author Alan Liu
* @version 1.47, 01/12/98
* @see java.text.DateFormat
* @see java.util.Calendar
* @see java.util.TimeZone
* @since JDK1.0
*/
public class Date implements java.io.Serializable, Cloneable {
/* If cal is null, then fastTime indicates the time in millis.
* Otherwise, fastTime is ignored, and cal indicates the time.
* The cal object is only created if a setXxx call is made to
* set a field. For other operations, staticCal is used instead.
*/
private transient Calendar cal;
private transient long fastTime;
private static Calendar staticCal;
private static Calendar utcCal;
private static DateFormat formatter;
private static DateFormat gmtFormatter;
private static int defaultCenturyStart;
private static TimeZone cachedDefaultZone;
/* use serialVersionUID from modified java.util.Date for
* interoperability with JDK1.1. The Date was modified to write
* and read only the UTC time.
*/
private static final long serialVersionUID = 7523967970034938905L;
static {
cachedDefaultZone = TimeZone.getDefault();
staticCal = new GregorianCalendar();
defaultCenturyStart = staticCal.get(Calendar.YEAR) - 80;
utcCal = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
gmtFormatter = new SimpleDateFormat("d MMM yyyy HH:mm:ss 'GMT'", Locale.US);
gmtFormatter.setTimeZone(TimeZone.getTimeZone("Africa/Casablanca"));
}
/**
* Allocates a <code>Date</code> object and initializes it so that
* it represents the time at which it was allocated measured to the
* nearest millisecond.
*
* @see java.lang.System#currentTimeMillis()
* @since JDK1.0
*/
public Date() {
this(System.currentTimeMillis());
}
/**
* Allocates a <code>Date</code> object and initializes it to
* represent the specified number of milliseconds since January 1,
* 1970, 00:00:00 GMT.
*
* @param date the milliseconds since January 1, 1970, 00:00:00 GMT.
* @see java.lang.System#currentTimeMillis()
* @since JDK1.0
*/
public Date(long date) {
cal = null;
fastTime = date;
}
/**
* Allocates a <code>Date</code> object and initializes it so that
* it represents midnight, local time, at the beginning of the day
* specified by the <code>year</code>, <code>month</code>, and
* <code>date</code> arguments.
*
* @param year the year minus 1900.
* @param month the month between 0-11.
* @param date the day of the month between 1-31.
* @see java.util.Calendar
* @since JDK1.0
* @deprecated As of JDK version 1.1,
* replaced by <code>Calendar.set(year + 1900, month, date)</code>
* or <code>GregorianCalendar(year + 1900, month, date)</code>.
*/
public Date(int year, int month, int date) {
this(year, month, date, 0, 0, 0);
}
/**
* Allocates a <code>Date</code> object and initializes it so that
* it represents the specified hour and minute, local time, of the
* date specified by the <code>year</code>, <code>month</code>,
* <code>date</code>, <code>hrs</code>, and <code>min</code> arguments.
*
* @param year the year minus 1900.
* @param month the month between 0-11.
* @param date the day of the month between 1-31.
* @param hrs the hours between 0-23.
* @param min the minutes between 0-59.
* @see java.util.Calendar
* @since JDK1.0
* @deprecated As of JDK version 1.1,
* replaced by <code>Calendar.set(year + 1900, month, date,
* hrs, min)</code> or <code>GregorianCalendar(year + 1900,
* month, date, hrs, min)</code>.
*/
public Date(int year, int month, int date, int hrs, int min) {
this(year, month, date, hrs, min, 0);
}
/**
* Allocates a <code>Date</code> object and initializes it so that
* it represents the specified hour, minute, and second, local time
* of the date specified by the <code>year</code>, <code>month</code>,
* <code>date</code>, <code>hrs</code>, <code>min</code>, and
* <code>sec</code> arguments.
*
* @param year the year minus 1900.
* @param month the month between 0-11.
* @param date the day of the month between 1-31.
* @param hrs the hours between 0-23.
* @param min the minutes between 0-59.
* @param sec the seconds between 0-59.
* @see java.util.Calendar
* @since JDK1.0
* @deprecated As of JDK version 1.1,
* replaced by <code>Calendar.set(year + 1900, month, date,
* hrs, min, sec)</code> or <code>GregorianCalendar(year + 1900,
* month, date, hrs, min, sec)</code>.
*/
public Date(int year, int month, int date, int hrs, int min, int sec) {
cal = null;
synchronized (staticCal) {
TimeZone defaultZone = TimeZone.getDefault();
if (!defaultZone.equals(cachedDefaultZone)) {
staticCal.setTimeZone(defaultZone);
formatter.setTimeZone(defaultZone);
cachedDefaultZone = defaultZone;
}
staticCal.clear();
staticCal.set(year + 1900, month, date, hrs, min, sec);
fastTime = staticCal.getTimeInMillis();
}
}
/**
* Allocates a <code>Date</code> object and initializes it so that
* it represents the date and time indicated by the string
* <code>s</code>, which is interpreted as if by the
* <code>parse</code> method.
*
* @param s a string representation of the date.
* @see java.text.DateFormat
* @see java.util.Date#parse(java.lang.String)
* @since JDK1.0
* @deprecated As of JDK version 1.1,
* replaced by <code>DateFormat.parse(String s)</code>.
*/
public Date(String s) {
this(parse(s));
}
/**
* Determines the date and time based on the arguments. The
* arguments are interpreted in UTC, not in the local time zone
*
* @param year the year minus 1900.
* @param month the month between 0-11.
* @param date the day of the month between 1-31.
* @param hrs the hours between 0-23.
* @param min the minutes between 0-59.
* @param sec the seconds between 0-59.
* @return the number of milliseconds since January 1, 1970, 00:00:00 GMT for
* the date and time specified by the arguments.
* @see java.util.Calendar
* @since JDK1.0
* @deprecated As of JDK version 1.1,
* replaced by <code>Calendar.set(year + 1900, month, date,
* hrs, min, sec)</code> or <code>GregorianCalendar(year + 1900,
* month, date, hrs, min, sec)</code>, using a UTC
* <code>TimeZone</code>, followed by <code>Calendar.getTime().getTime()</code>.
*/
public static long UTC(int year, int month, int date,
int hrs, int min, int sec) {
synchronized (utcCal) {
utcCal.clear();
utcCal.set(year + 1900, month, date, hrs, min, sec);
return utcCal.getTimeInMillis();
}
}
/**
* Given a string representing a time, parse it and return the time
* value. This method recognizes most standard syntaxes.
* <p>
* It accepts many syntaxes; in particular, it recognizes the IETF
* standard date syntax: "Sat, 12 Aug 1995 13:30:00 GMT". It also
* understands the continental U.S. time-zone abbreviations, but for
* general use, a time-zone offset should be used: "Sat, 12 Aug 1995
* 13:30:00 GMT+0430" (4 hours, 30 minutes west of the Greenwich
* meridian). If no time zone is specified, the local time zone is
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?