package java.util;
public class Date implements Cloneable, Comparable, java.io.Serializable
{
private static final long serialVersionUID = 7523967970034938905L;
private transient long time;
public Date()
{
time = System.currentTimeMillis();
}
public Date(long time)
{
this.time = time;
}
public Date(int year, int month, int day)
{
time = new GregorianCalendar(year + 1900, month, day).getTimeInMillis();
}
public Date(int year, int month, int day, int hour, int min)
{
time =
new GregorianCalendar(year + 1900, month, day, hour,
min).getTimeInMillis();
}
public Date(int year, int month, int day, int hour, int min, int sec)
{
time =
new GregorianCalendar(year + 1900, month, day, hour, min,
sec).getTimeInMillis();
}
public Date(String s)
{
time = parse(s);
}
public Object clone()
{
try
{
return super.clone();
}
catch (CloneNotSupportedException ex)
{
return null;
}
}
public static long UTC(int year, int month, int date,
int hrs, int min, int sec)
{
GregorianCalendar cal =
new GregorianCalendar(year + 1900, month, date, hrs, min, sec);
cal.set(Calendar.ZONE_OFFSET, 0);
cal.set(Calendar.DST_OFFSET, 0);
return cal.getTimeInMillis();
}
public long getTime()
{
return time;
}
public int getTimezoneOffset()
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
return (cal.get(Calendar.ZONE_OFFSET)
+ cal.get(Calendar.DST_OFFSET)) / (60 * 1000);
}
public void setTime(long time)
{
this.time = time;
}
public boolean after(Date when)
{
return time > when.time;
}
public boolean before(Date when)
{
return time < when.time;
}
public boolean equals(Object obj)
{
return (obj instanceof Date && time == ((Date) obj).time);
}
public int compareTo(Date when)
{
return (time < when.time) ? -1 : (time == when.time) ? 0 : 1;
}
public int compareTo(Object obj)
{
return compareTo((Date) obj);
}
public int hashCode()
{
return (int) time ^ (int) (time >>> 32);
}
private static final String[] weekNames = { "Sun", "Mon", "Tue", "Wed",
"Thu", "Fri", "Sat" };
private static final String[] monthNames = { "Jan", "Feb", "Mar", "Apr",
"May", "Jun", "Jul", "Aug",
"Sep", "Oct", "Nov", "Dec" };
public String toString()
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
String day = "0" + cal.get(Calendar.DATE);
String hour = "0" + cal.get(Calendar.HOUR_OF_DAY);
String min = "0" + cal.get(Calendar.MINUTE);
String sec = "0" + cal.get(Calendar.SECOND);
String year = "000" + cal.get(Calendar.YEAR);
return weekNames[cal.get(Calendar.DAY_OF_WEEK) - 1] + " "
+ monthNames[cal.get(Calendar.MONTH)] + " "
+ day.substring(day.length() - 2) + " "
+ hour.substring(hour.length() - 2) + ":"
+ min.substring(min.length() - 2) + ":"
+ sec.substring(sec.length() - 2) + " "
+
cal.getTimeZone().getDisplayName(cal.getTimeZone().inDaylightTime(this),
TimeZone.SHORT) + " " +
year.substring(year.length() - 4);
}
public String toLocaleString()
{
return java.text.DateFormat.getInstance().format(this);
}
public String toGMTString()
{
java.text.DateFormat format = java.text.DateFormat.getInstance();
format.setTimeZone(TimeZone.getTimeZone("GMT"));
return format.format(this);
}
private static int parseTz(String tok, char sign)
throws IllegalArgumentException
{
int num;
try
{
num = Integer.parseInt(tok.substring(1));
}
catch (NumberFormatException ex)
{
throw new IllegalArgumentException(tok);
}
if (num < 24)
num *= 60;
else
num = (num / 100) * 60 + num % 100;
return sign == '-' ? -num : num;
}
private static int parseMonth(String tok)
{
String months[] = { "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY",
"JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER",
"NOVEMBER", "DECEMBER" };
int i;
for (i = 0; i < 12; i++)
if (months[i].startsWith(tok))
return i;
return -1;
}
private static boolean parseDayOfWeek(String tok)
{
String daysOfWeek[] = { "SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY",
"THURSDAY", "FRIDAY", "SATURDAY" };
int i;
for (i = 0; i < 7; i++)
if (daysOfWeek[i].startsWith(tok))
return true;
return false;
}
public static long parse(String string)
{
int year = -1;
int month = -1;
int day = -1;
int hour = -1;
int minute = -1;
int second = -1;
int timezone = 0;
boolean localTimezone = true;
StringBuffer buf = new StringBuffer();
int parenNesting = 0;
int len = string.length();
for (int i = 0; i < len; i++)
{
char ch = string.charAt(i);
if (ch >= 'a' && ch <= 'z')
ch -= 'a' - 'A';
if (ch == '(')
parenNesting++;
else if (parenNesting == 0)
buf.append(ch);
else if (ch == ')')
parenNesting--;
}
int tmpMonth;
StringTokenizer strtok = new StringTokenizer(buf.toString(), " \t\n\r,");
while (strtok.hasMoreTokens())
{
String tok = strtok.nextToken();
char firstch = tok.charAt(0);
if ((firstch == '+' || firstch == '-') && year >= 0)
{
timezone = parseTz(tok, firstch);
localTimezone = false;
}
else if (firstch >= '0' && firstch <= '9')
{
while (tok != null && tok.length() > 0)
{
int punctOffset = tok.length();
int num = 0;
int punct;
for (int i = 0; ; i++)
{
if (i >= punctOffset)
{
punct = -1;
break;
}
else
{
punct = tok.charAt(i);
if (punct >= '0' && punct <= '9')
{
if (num > 999999999) throw new IllegalArgumentException(tok);
num = 10 * num + (punct - '0');
}
else
{
punctOffset = i;
break;
}
}
}
if (punct == ':')
{
if (hour < 0)
hour = num;
else
minute = num;
}
else if ((num >= 70
&& (punct == ' ' || punct == ','
|| punct == '/' || punct < 0))
|| (num < 70 && day >= 0 && month >= 0 && year < 0))
{
if (num >= 100)
year = num;
else
{
int curYear = 1900 + new Date().getYear();
int firstYear = curYear - 80;
year = firstYear / 100 * 100 + num;
if (year < firstYear)
year += 100;
}
}
else if (punct == '/')
{
if (month < 0)
month = num - 1;
else
day = num;
}
else if (hour >= 0 && minute < 0)
minute = num;
else if (minute >= 0 && second < 0)
second = num;
else if (day < 0)
day = num;
else
throw new IllegalArgumentException(tok);
if (punct < 0 || punctOffset + 1 >= tok.length())
tok = null;
else
tok = tok.substring(punctOffset + 1);
}
}
else if (firstch >= 'A' && firstch <= 'Z')
{
if (tok.equals("AM"))
{
if (hour < 1 || hour > 12)
throw new IllegalArgumentException(tok);
if (hour == 12)
hour = 0;
}
else if (tok.equals("PM"))
{
if (hour < 1 || hour > 12)
throw new IllegalArgumentException(tok);
if (hour < 12)
hour += 12;
}
else if (parseDayOfWeek(tok))
; else if (tok.equals("UT") || tok.equals("UTC") || tok.equals("GMT"))
localTimezone = false;
else if (tok.startsWith("UT") || tok.startsWith("GMT"))
{
int signOffset = 3;
if (tok.charAt(1) == 'T' && tok.charAt(2) != 'C')
signOffset = 2;
char sign = tok.charAt(signOffset);
if (sign != '+' && sign != '-')
throw new IllegalArgumentException(tok);
timezone = parseTz(tok.substring(signOffset), sign);
localTimezone = false;
}
else if ((tmpMonth = parseMonth(tok)) >= 0)
month = tmpMonth;
else if (tok.length() == 3 && tok.charAt(2) == 'T')
{
char ch = tok.charAt(0);
if (ch == 'E')
timezone = -5 * 60;
else if (ch == 'C')
timezone = -6 * 60;
else if (ch == 'M')
timezone = -7 * 60;
else if (ch == 'P')
timezone = -8 * 60;
else
throw new IllegalArgumentException(tok);
if (tok.charAt(1) == 'D')
timezone += 60;
else if (tok.charAt(1) != 'S')
throw new IllegalArgumentException(tok);
localTimezone = false;
}
else
throw new IllegalArgumentException(tok);
}
else
throw new IllegalArgumentException(tok);
}
if (hour < 0)
hour = 0;
if (minute < 0)
minute = 0;
if (second < 0)
second = 0;
if (year < 0 || month < 0 || day < 0)
throw new IllegalArgumentException("Missing field");
GregorianCalendar cal
= new GregorianCalendar(year, month, day, hour, minute, second);
if (!localTimezone)
{
cal.set(Calendar.ZONE_OFFSET, timezone * 60 * 1000);
cal.set(Calendar.DST_OFFSET, 0);
}
return cal.getTimeInMillis();
}
public int getYear()
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
return cal.get(Calendar.YEAR) - 1900;
}
public void setYear(int year)
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
cal.set(Calendar.YEAR, 1900 + year);
time = cal.getTimeInMillis();
}
public int getMonth()
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
return cal.get(Calendar.MONTH);
}
public void setMonth(int month)
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
cal.set(Calendar.MONTH, month);
time = cal.getTimeInMillis();
}
public int getDate()
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
return cal.get(Calendar.DATE);
}
public void setDate(int date)
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
cal.set(Calendar.DATE, date);
time = cal.getTimeInMillis();
}
public int getDay()
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
return cal.get(Calendar.DAY_OF_WEEK) - 1;
}
public int getHours()
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
return cal.get(Calendar.HOUR_OF_DAY);
}
public void setHours(int hours)
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
cal.set(Calendar.HOUR_OF_DAY, hours);
time = cal.getTimeInMillis();
}
public int getMinutes()
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
return cal.get(Calendar.MINUTE);
}
public void setMinutes(int minutes)
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
cal.set(Calendar.MINUTE, minutes);
time = cal.getTimeInMillis();
}
public int getSeconds()
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
return cal.get(Calendar.SECOND);
}
public void setSeconds(int seconds)
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
cal.set(Calendar.SECOND, seconds);
time = cal.getTimeInMillis();
}
private void readObject(java.io.ObjectInputStream input)
throws java.io.IOException, ClassNotFoundException
{
input.defaultReadObject();
time = input.readLong();
}
private void writeObject(java.io.ObjectOutputStream output)
throws java.io.IOException
{
output.defaultWriteObject();
output.writeLong(time);
}
}