key0-96/
key0-96/doc/key/
key0-96/doc/key/credits/
key0-96/doc/key/developers/
key0-96/doc/key/developers/resources/
key0-96/setup/caves/
key0-96/setup/help/
key0-96/setup/ruins/
key0-96/src/
key0-96/src/commands/
key0-96/src/events/
key0-96/src/hack/
key0-96/src/sql/
key0-96/src/swing/
key0-96/src/talker/forest/
key0-96/src/talker/objects/
key0-96/src/terminals/
/*
**               j###t  ########## ####   ####
**              j###t   ########## ####   ####
**             j###T               "###L J###"
**          ######P'    ##########  #########
**          ######k,    ##########   T######T
**          ####~###L   ####
**          #### q###L  ##########   .#####
**          ####  \###L ##########   #####"
**
**  $Id$
**
**  Class History
**
**  Date        Name         Description
**  ---------|------------|-----------------------------------------------
**  19Aug98     subtle       start of recorded history
**  09Sep98     subtle       some optimisations
**
*/


package key.primitive;

import key.Player;
import key.AccessViolationException;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

public final class DateTime extends java.util.Date implements java.io.Serializable
{
	private static final long serialVersionUID = -8585425790209139587L;
	
	public DateTime()
	{
	}

	/**
	  *  Constructs a new time with the specified duration
	  *  in seconds
	 */
	public DateTime( long date )
	{
		super( date );
	}
	
	public DateTime( long date, Duration add )
	{
		super( date + add.getTime() );
	}
	
	/**
	  *  Calculates the difference between this datetime
	  *  and the supplied datetime
	 */
	public Duration difference( DateTime dt )
	{
		if( after( dt ) )
			return( new Duration( getTime() - dt.getTime() ) );
		else
			return( new Duration( dt.getTime() - getTime() ) );
	}
	
	/**
	  *  Increments this DateTime by the supplied Duration
	 */
	private DateTime add( Duration d )
	{
		return( new DateTime( d.getTime() + getTime() ) );
	}
	
	public String toString()
	{
		return( toString( null ) );
	}
	
	public String toString( Player observer )
	{
		DateTime n = this;
		String a = "";
		
		if( observer != null )
		{
			Duration d = observer.getTimezone();
			
			if( d.getTime() != 0 )
			{
				n = new DateTime( getTime() );
				n.add( d );
				a = " (your time)";
			}
		}
		
		return( getDayStr( n.getDay() ) + " " + getMonthStr( n.getMonth() ) + " " + Integer.toString( n.getDate() ) + ", " + getYearStr( n.getYear() ) + " " + Integer.toString( n.getHours() ) + ":" + getMinuteStr( n.getMinutes() ) + ":" + getSecondStr( n.getSeconds() ) + a );
	}

	private static String days[] =
		{ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
	
	private static String getDayStr( int d )
	{
		return( days[d] );
	}
	
	private static String months[] =
		{ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
		  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
	
	private static String getMonthStr( int m )
	{
		return( months[ m ] );
	}
	
	private static String getYearStr( int y )
	{
		return( new String( Integer.toString( 1900 + y ) ) );
	}

	private static String getMinuteStr( int m )
	{
		if ( m < 10 )
			return( "0" + Integer.toString( m ) );
		else
			return( Integer.toString( m ) );
	}

	private static String getSecondStr( int s )
	{
		if ( s < 10 )
			return( "0" + Integer.toString( s ) );
		else
			return( Integer.toString( s ) );
	}
	
	private static String error = "cannot 'set' in immutable DateTime object";
	
	/*
	public void setTime( long time ) { throw new AccessViolationException( this, error ); }
	public void setYear( int year ) { throw new AccessViolationException( this, error ); }
    public void setMonth(int month) { throw new AccessViolationException( this, error ); }
    public void setDate(int date) { throw new AccessViolationException( this, error ); }
    public void setHours(int hours) { throw new AccessViolationException( this, error ); }
    public void setMinutes(int minutes) { throw new AccessViolationException( this, error ); }
    public void setSeconds(int seconds) { throw new AccessViolationException( this, error ); }
	*/
	
	/**
	  *  Returns a DateTime representing the current time + the duration
	 */
	public static DateTime nowPlus( Duration d )
	{
		return( new DateTime( d.getTime() + System.currentTimeMillis() ) );
	}
}