/*
 *   
 *
 * Copyright  1990-2006 Sun Microsystems, Inc. All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version
 * 2 only, as published by the Free Software Foundation. 
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License version 2 for more details (a copy is
 * included at /legal/license.txt). 
 * 
 * You should have received a copy of the GNU General Public License
 * version 2 along with this work; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA 
 * 
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
 * Clara, CA 95054 or visit www.sun.com if you need additional
 * information or have any questions. 
 */

package java.util;

/**
 * The class Date represents a specific instant in time, with millisecond
 * precision.
 * <p>
 * This Class has been subset for the MID Profile based on JDK 1.3.
 * In the full API, the class Date 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 Calendar
 * class should be used to convert between dates and time fields and
 * the DateFormat class should be used to format and parse date strings.
 * The corresponding methods in Date are deprecated.
 * <p>
 * Although the Date 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 = 24x60x60 = 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.
 *
 * @see		TimeZone
 * @see		Calendar
 * @version	1.0 (J2ME MIDP)
 */
public class Date {
  private long millis;

  /**
   * Allocates a <code>Date</code> object and initializes it to 
   * represent the current time specified number of milliseconds since the 
   * standard base time known as "the epoch", namely January 1, 
   * 1970, 00:00:00 GMT. 
   * @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) {
    millis = date;
  }

  /**
   * Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT
   * represented by this <tt>Date</tt> object.
   *
   * @return  the number of milliseconds since January 1, 1970, 00:00:00 GMT
   *          represented by this date.
   *
   * @see #setTime 
   */
  public long getTime() {
    return millis;
  }

  /**
   * Sets this <tt>Date</tt> object to represent a point in time that is 
   * <tt>time</tt> milliseconds after January 1, 1970 00:00:00 GMT.
   *
   * @param   time   the number of milliseconds.
   *
   * @see #getTime
   */
  public void setTime(long time) {
    millis = time;
  }

  /**
   * Compares two dates for equality.
   * The result is <code>true</code> if and only if the argument is 
   * not <code>null</code> and is a <code>Date</code> object that 
   * represents the same point in time, to the millisecond, as this object.
   * <p>
   * Thus, two <code>Date</code> objects are equal if and only if the 
   * <code>getTime</code> method returns the same <code>long</code> 
   * value for both. 
   *
   * @param   obj   the object to compare with.
   * @return  <code>true</code> if the objects are the same;
   *          <code>false</code> otherwise.
   * @see     java.util.Date#getTime()
   */
  public boolean equals(Object obj) {
    return obj != null && obj instanceof Date && getTime() == ((Date) obj).getTime();
  }

  /**
   * Returns a hash code value for this object. The result is the 
   * exclusive OR of the two halves of the primitive <tt>long</tt> 
   * value returned by the {@link Date#getTime} 
   * method. That is, the hash code is the value of the expression:
   * <blockquote><pre>
   * (int)(this.getTime()^(this.getTime() >>> 32))</pre></blockquote>
   *
   * @return  a hash code value for this object. 
   */
  public int hashCode() {
    long ht = getTime();
    return (int) ht ^ (int) (ht >> 32);
  }
}
