こんにちは、さるまりんです。
タイトルにあることをしたいんです。有効期限チェック。
例えば5分以内?例えば1時間以内?
これはある日時dateから指定時間以上経過したかを調べることでできますよね。
ということで「文字列で表された日時は現在より指定時間以上前?」をJavaで書いてみたいと思います。
早速プログラムです。
有効期限は5分、チェックする日時を2019年5月26日 23:42:30としています。
String datetimeString = "2019-05-26 23:42:30"; // 日時の文字列
String format = "yyyy-MM-dd HH:mm:ss"; // 日時の文字列のフォーマット
int x = 5; // X分前のX
// 日付の文字列をDateオブジェクトに変換
DateFormat df = new SimpleDateFormat(format);
Date date;
try {
date = df.parse(datetimeString);
} catch (ParseException e) {
// 変換に失敗
date = null;
}
// 変換できたら比較します。
if (date != null) {
// 現在からX分前のDateオブジェクトを作成
// 現在日時
Calendar c = Calendar.getInstance();
// からX分引き
c.add(Calendar.MINUTE, -x);
// Dateオブジェクトにします
Date past = c.getTime();
// 現在の日時を表示
System.out.println("現在は" + df.format(new Date()) + "です");
// 日付dateが作成されたDate(past)と同じかそれよりも前ならx分以上前です。
if (date.equals(past) || date.before(past)) {
System.out.println(datetimeString + "は現在より" + x + "分以上前です");
} else {
System.out.println(datetimeString + "は現在より" + x + "分以上前じゃないです");
}
}
実行するとこんな風に表示されます。
2019年5月26日 23:47:20に実行。有効期限前です。
現在は2019-05-26 23:47:20です
2019-05-26 23:42:30は現在より5分以上前じゃないです
2019年5月26日 23:47:33に実行。有効期限後です。
現在は2019-05-26 23:47:33です
2019-05-26 23:42:30は現在より5分以上前です
Calendar.getInstance()
は現在日時で初期化されたCalendar
オブジェクトを返します。
[Calendarオブジェクト].add()
は指定した期間をCalendar
オブジェクトに足します。進めるということですね。そして指定する数値を負の数にすると逆に戻してくれます。上のプログラムではCalendar.MINUTE
(分)を単位として、-X
分足すことでX分前にしています。
[Calendarオブジェクト].getTime()
でそのCalendar
オブジェクトが示す日時をDate
クラスのオブジェクトとして取得することができます。
ある日付から指定時間前のDate
オブジェクトを作成するメソッドがあると便利かなと思います。こんな感じですかね。
/**
* dateの指定期間前のDateオブジェクトを作成
* @param date 元となるDateオブジェクト
* @param field 単位(field)を表す値 Calendar.HOUR、MINUTEなど
* @param amount 期間を表す数値
* @return dateのfield、amountで指定された期間前のDateオブジェクト (Calendar.MINUTE, -5)なら5分前
*/
public Date getDateByPeriodOfTime(Date date, int field, int amount) {
if (date == null) return date;
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(field, amount);
return c.getTime();
}
いつも思います。もっと格好良くかけるんじゃないかって。
勉強します。プログラムもスマートに。
読んでくださってありがとうございます。
ではまた!