package model;
import java.util.Calendar;
/**
* Date.java
*
* @author Christopher Bertels (chbertel@uos.de)
* @date 15.09.2008
*
* Eigene {@link Date} Klasse. Wird genutzt für korrekte Verwaltung von Zeitpunkten
* {@link java.util.Date} funktioniert nicht ausreichend/ist deprecated.
*/
public class Date implements Comparable<Date>
{
private int date = Data.NOTSET;
private int month = Data.NOTSET;
private int year = Data.NOTSET;
/**
* Erstellt {@link Date} Objekt mit übergebenen Tag/Monat/Jahr Werten.
* @param day Der Tag im Monat.
* @param month Der Monat (1 bis 12).
* @param year Das Jahr.
*/
public Date(int day, int month, int year)
{
if (day > 0 && month > 0 && day <= 31 && month <= 12)
{
this.date = day;
this.month = month;
this.year = year;
}
else
{
throw new NumberFormatException("Ungültiges Datum: " + day + "." + month + "." + year);
}
}
/**
* Erstellt {@link Date} Objekt mit aktuellem Datum.
*/
public Date()
{
Calendar cal = Calendar.getInstance();
this.date = cal.get(Calendar.DAY_OF_MONTH);
this.month = cal.get(Calendar.MONTH) + 1; // keine ahnung, warum das so ist...
this.year = cal.get(Calendar.YEAR);
}
/**
* Gibt den Tag im Monat (zB 10 für 10.3.2008) zurück.
* @return Der Tag im Monat.
*/
public int getDate() // aus Kompatibilitätsgründen zu java.util.Date
{
return this.date;
}
/**
* Setzt den Tag im Monat.
* @param date Der neue tag im Monat.
*/
public void setDate(int date)
{
if (date >= 0)
{
this.date = date;
}
}
/**
* Gibt den Monat zurück.
* @return Der Monat.
*/
public int getMonth()
{
return this.month;
}
/**
* Setzt den Monat.
* @param month Der neue Monat (1 bis 12).
*/
public void setMonth(int month)
{
if (month >= 0)
{
this.month = month;
}
}
/**
* Gibt das Jahr zurück.
* @return Das Jahr des Datums.
*/
public int getYear()
{
return this.year;
}
/**
* Setzt das Jahr.
* @param year Das neue Jahr des Datums.
*/
public void setYear(int year)
{
if (year >= 0)
{
this.year = year;
}
}
/**
* Gibt das Datum als {@link String} zurück.
* Bsp: 10.12.2007
*/
public String toString()
{
StringBuilder sb = new StringBuilder();
if(this.date < 10)
{
sb.append("0");
}
sb.append(this.date);
sb.append(".");
if(this.month < 10)
{
sb.append("0");
}
sb.append(this.month);
sb.append(".");
sb.append(this.year);
return sb.toString();
}
/**
* Wird beim Speichern von {@link Date} Objekten ins XML-Format genutzt.
*
* @return Datum in XML-Speicherbarer Form (tag:monat:jahr).
*/
public String toXMLOutputString()
{
return this.date + ":" + this.month + ":" + this.year;
}
/**
* Vergleicht dieses {@link Date} Objekt mit einem übergebenen
* Siehe {@link Comparable}.compareTo().
*/
@Override
public int compareTo(Date other)
{
int diffYear = this.year - other.year;
int diffMonth = this.month - other.month;
int diffDate = this.date - other.date;
if(diffYear != 0) // nicht gleiches jahr => einfach differenz zurück
{
return diffYear;
}
else
{
if(diffMonth != 0) // nicht gleicher monat, einfach diff. zurück
{
return diffMonth;
}
else
{
return diffDate; // falls jahr und monat gleich, diff. von monatstag zurück.
}
}
}
/*
* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object obj)
{
if(obj instanceof Date)
{
Date other = (Date)obj;
return this.compareTo(other) == 0;
}
return false;
}
/**
* Gibt ein Datum zurück bei dem zu diesem Datum amountOfWeeks Wochen hinzugefügt wurden.
* @param amountOfWeeks Die Anzahl Wochen nach diesem Datum.
* @return Das {@link Date} Objekt, das dem Datum amountOfWeeks Wochen nach diesem entspricht.
*/
public Date addWeeks(int amountOfWeeks)
{
Calendar cal = getCalForDate(this);
cal.add(Calendar.DATE, amountOfWeeks * 7);
return fromStdDate(cal.getTime());
}
/**
* Gibt ein Datum zurück bei dem zu diesem Datum amounOfDays Tage hinzugefügt wurden.
* @param amountOfDays Die Anzahl Tage nach diesem Datum.
* @return Das {@link Date} Objekt, das dem Datum amountOfDays Tage nach diesem entspricht.
*/
public Date addDays(int amountOfDays)
{
Calendar cal = getCalForDate(this);
cal.add(Calendar.DATE, amountOfDays);
return fromStdDate(cal.getTime());
}
/**
* Gibt das Datum in Millisekunden zurück.
* (Siehe Calendar.getTimeInMillis()
* @return Millisekunden des Datums.
*/
public long getTimeInMillis()
{
return getCalForDate(this).getTimeInMillis();
}
/**
* Gibt ein {@link model.Date} Objekt basierend auf einem {@link java.util.Date} Objekt zurück.
* @param stdDate Das java.util.Date Objekt.
* @return Das model.Date Objekt, basierend auf dem übergebenen java.util.Date Objekt.
*/
public static Date fromStdDate(java.util.Date stdDate)
{
Calendar cal = Calendar.getInstance();
cal.setTime(stdDate);
return new Date(cal.get(Calendar.DATE), cal.get(Calendar.MONTH), cal.get(Calendar.YEAR));
}
/**
* Parsed einen {@link String} als {@link Date} Objekt und gibt dieses zurück.
* @param dateString Der String, welcher ein Date wiederspiegelt (getrennt durch ':')
* Bsp: 10:10:2008
* @return Das aus dem String geparsete Date Objekt.
*/
public static Date parseString(String dateString)
{
if (dateString != null && !dateString.equals(""))
{
String[] date = dateString.split(":");
if (date.length == 3)
{
int day, month, year = Data.NOTSET;
day = Integer.parseInt(date[0]);
month = Integer.parseInt(date[1]);
year = Integer.parseInt(date[2]);
return new Date(day, month, year);
}
}
// wenn hier angekommen, falscher dateString => fehler!
throw new NumberFormatException("DateString ist ungültig!");
}
/**
* Gibt ein {@link Calendar} Objekt für ein übergebenes {@link Date} Objekt zurück.
* Wird derzeit nur klassenintern gebraucht.
* @param date Das Date Objekt, für das ein {@link Calendar} Objekt erstellt werden soll.
* @return Das {@link Calendar} Objekt.
*/
private static Calendar getCalForDate(Date date)
{
Calendar cal = Calendar.getInstance();
cal.set(date.year, date.month, date.date);
return cal;
}
}