📄 date.java
字号:
/* * @(#)Date.java 1.74 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */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;import java.lang.ref.SoftReference;/** * 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: * <blockquote><pre> * <a href=http://tycho.usno.navy.mil>http://tycho.usno.navy.mil</a> * </pre></blockquote> * <p> * and their definitions of "Systems of Time" at: * <blockquote><pre> * <a href=http://tycho.usno.navy.mil/systime.html>http://tycho.usno.navy.mil/systime.html</a> * </pre></blockquote> * <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 from 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 61; the values 60 and * 61 occur only for leap seconds and even then only in Java * implementations that actually track leap seconds correctly. Because * of the manner in which leap seconds are currently introduced, it is * extremely unlikely that two leap seconds will occur in the same * minute, but this specification follows the date and time conventions * for ISO C. * </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.74, 01/23/03 * @see java.text.DateFormat * @see java.util.Calendar * @see java.util.TimeZone * @since JDK1.0 */public class Date implements java.io.Serializable, Cloneable, Comparable { /* DEFAULT ZONE SYNCHRONIZATION: Part of the usage model of Date * is that a Date object behaves like a Calendar object whose zone * is the current default TimeZone. As a result, we must be * careful about keeping this phantom calendar in sync with the * default TimeZone. There are three class and instance variables * to watch out for to achieve this. (1)staticCal. Whenever this * object is used, it must be reset to the default zone. This is a * cheap operation which can be done directly (just a reference * assignment), so we just do it every time. (2)simpleFormatter. * Likewise, the DateFormat object we use to implement toString() * must be reset to the current default zone before use. Again, * this is a cheap reference assignment. (3)cal. This is a little * more tricky. Unlike the other cached static objects, cal has * state, and we don't want to monkey with it willy-nilly. The * correct procedure is to change the zone in a way that doesn't * alter the time of this object. This means getting the millis * (forcing a fields->time conversion), setting the zone, and then * restoring the millis. The zone must be set before restoring * the millis. Since this is an expensive operation, we only do * this when we have to. - liu 1.2b4 */ /* 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 = null; private static Calendar utcCal = null; private static int defaultCenturyStart = 0; /* 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; /** * Caches for the DateFormatters used by various toString methods. */ private static SoftReference simpleFormatter = null; private static SoftReference gmtFormatter = null; /** * 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() */ public Date() { this(System.currentTimeMillis()); } /** * Allocates a <code>Date</code> object and initializes it to * represent the specified number of milliseconds since the * standard base time known as "the epoch", namely January 1, * 1970, 00:00:00 GMT. * * @param date the milliseconds since January 1, 1970, 00:00:00 GMT. * @see java.lang.System#currentTimeMillis() */ 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 * @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 instant at the start of the minute specified by * the <code>year</code>, <code>month</code>, <code>date</code>, * <code>hrs</code>, and <code>min</code> arguments, 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. * @see java.util.Calendar * @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 instant at the start of the second specified * by the <code>year</code>, <code>month</code>, <code>date</code>, * <code>hrs</code>, <code>min</code>, and <code>sec</code> arguments, * 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. * @see java.util.Calendar * @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; if (staticCal == null) makeStaticCalendars(); synchronized (staticCal) { staticCal.setTimeZone(TimeZone.getDefault()); 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 * {@link Date#parse} method. * * @param s a string representation of the date. * @see java.text.DateFormat * @see java.util.Date#parse(java.lang.String) * @deprecated As of JDK version 1.1, * replaced by <code>DateFormat.parse(String s)</code>. */ public Date(String s) { this(parse(s)); } /** * Return a copy of this object. */ public Object clone() { Date d = null; try { d = (Date)super.clone(); if (d.cal != null) d.cal = (Calendar)d.cal.clone(); } catch (CloneNotSupportedException e) {} // Won't happen return d; } /** * Determines the date and time based on the arguments. The * arguments are interpreted as a year, month, day of the month, * hour of the day, minute within the hour, and second within the * minute, exactly as for the <tt>Date</tt> constructor with six * arguments, except that the arguments are interpreted relative * to UTC rather than to the local time zone. The time indicated is * returned represented as the distance, measured in milliseconds, * of that time from the epoch (00:00:00 GMT on January 1, 1970). * * @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 * @deprecated As of JDK version 1.1,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -