拡張日付クラス

どのプロジェクトでも、大体便利に使えるので。


package exdt;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class ExDate extends Date {

/////////////////////////////////////////////////////////////////
// constructor

public 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);
}

}

/////////////////////////////////////////////////////////////////
// get

public 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);
}

/////////////////////////////////////////////////////////////////
// add

public 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());
}

/////////////////////////////////////////////////////////////////
// equals

public 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));
}

/////////////////////////////////////////////////////////////////
// toString

public String toString() {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
return format.format(this);
}

/////////////////////////////////////////////////////////////////
// private

private 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()