どのプロジェクトでも、大体便利に使えるので。
package exdt;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;public class ExDate extends Date {
/////////////////////////////////////////////////////////////////
// constructorpublic ExDate() {
super();
}public ExDate(int year, int month, int date) {
this(year, month, date, 0, 0, 0);
}public ExDate(int year, int month, int date, int hrs, int min, int sec) {
Calendar cal = Calendar.getInstance();
cal.set(year, month, date, hrs, min, sec);
setTime(cal.getTimeInMillis());
}public ExDate(long date) {
super(date);
}public ExDate(Date date) {
super(date.getTime());
}public ExDate(String source) {
SimpleDateFormat format = new SimpleDateFormat();
format.setLenient(false);if (source.matches("^[0-9]{14}$"))
format.applyPattern("yyyyMMddHHmmss");
else if (source.matches("^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$"))
format.applyPattern("yyyy-MM-dd HH:mm:ss");
else if (source.matches("^[0-9]{4}/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$"))
format.applyPattern("yyyy/MM/dd HH:mm:ss");
else if (source.matches("^[0-9]{8}$"))
format.applyPattern("yyyyMMdd");
else if (source.matches("^[0-9]{4}-[0-9]{2}-[0-9]{2}$"))
format.applyPattern("yyyy-MM-dd");
else if (source.matches("^[0-9]{4}/[0-9]{2}/[0-9]{2}$"))
format.applyPattern("yyyy/MM/dd");
else
throw new RuntimeException("illegal date format: " + source);try {
format.parse(source);
} catch (ParseException e) {
throw new RuntimeException(e);
}}
/////////////////////////////////////////////////////////////////
// getpublic int getYear() {
return get(Calendar.YEAR);
}public int getMon() {
return get(Calendar.MONTH);
}public int getDay() {
return get(Calendar.DAY_OF_MONTH);
}public int getHour() {
return get(Calendar.HOUR_OF_DAY);
}public int getMin() {
return get(Calendar.MINUTE);
}public int getSec() {
return get(Calendar.SECOND);
}public ExDate withoutTime() {
return roundoffTime(this);
}public int get(int field) {
Calendar cal = Calendar.getInstance();
cal.setTime(this);
return cal.get(field);
}/////////////////////////////////////////////////////////////////
// addpublic ExDate addYear(int amount) {
return add(Calendar.YEAR, amount);
}public ExDate addMon(int amount) {
return add(Calendar.MONTH, amount);
}public ExDate addDay(int amount) {
return add(Calendar.DAY_OF_MONTH, amount);
}public ExDate addHour(int amount) {
return add(Calendar.HOUR_OF_DAY, amount);
}public ExDate addMin(int amount) {
return add(Calendar.MINUTE, amount);
}public ExDate addSec(int amount) {
return add(Calendar.SECOND, amount);
}public ExDate add(int field, int amount) {
Calendar cal = Calendar.getInstance();
cal.setTime(this);
cal.add(field, amount);
return new ExDate(cal.getTime());
}/////////////////////////////////////////////////////////////////
// equalspublic boolean equals(String source) {
ExDate exdt = new ExDate(source);
return super.equals(exdt);
}public boolean equalsWithoutTime(String source) {
return this.equalsWithoutTime(new ExDate(source));
}public boolean equalsWithoutTime(Date date) {
return roundoffTime(this).equals(roundoffTime(date));
}/////////////////////////////////////////////////////////////////
// toStringpublic String toString() {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
return format.format(this);
}/////////////////////////////////////////////////////////////////
// privateprivate ExDate roundoffTime(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return new ExDate(cal.getTime());
}}
いくつか…
- StringやIntegerのように内部の状態を変化させない。
- 引数で渡したりするとき、問題が出てくる。
- setTime()は使わせないほうがいいかも…
- オーバーライドして非推奨にする。
- オーバーライドして実行時例外を投げる。
- ミリ秒の扱いに気をつける。
- 一見、同じ日時なのにeauals()がfalseになるとか…
- コンストラクタでミリ秒を丸めるとか。
- 月が「0」から開始されることに注意。
- 1〜12のインターフェースのほうがいいのかなぁ…
- 必要に応じて次のメソッドを追加。
- isBusinessDay()
- prevBusinessDay()
- nextBusinessDay()
- firstDayOfMonth()
- lastDayOfMonth()
- firstBusinessDayOfMonth()
- lastBusinessDayOfMonth()