Java 時刻型(時間)かどうかをチェックする方法

Javaで時刻型(HH:mm)かどうかをチェック方法です。

実務では時間管理は重要です。正確な時間のチェックが求められます。ところが、時刻は12時間表示だったり、24時間表示だったりする場合もあり、チェック方法が悩ましいところです。業界によっては25時とか26時などで扱われることもありますからね。

一般的には、タイムカード的な発想で 時:分(hh24:mm) で時間入力されることが多いのではないでしょうか?

ここでは Javaで時:分(hh24:mm) 型であるかどうかの方法 を紹介します。


時刻型チェック方法

時刻のチェックには Pattern クラスと Matcher クラスを利用します。まずはサンプルソース見てみましょう。

/**
 * 指定された文字列が時刻型かどうかを返します。
 *
 * @param value 文字列
 * @return true:正常, false:異常
 */
public static boolean isTimeType(String value) {
  if ( value == null || "".equals(value) )
    return false;
  Pattern p = Pattern.compile("^([0-1][0-9]|[2][0-3]):[0-5][0-9]$");
  Matcher m = p.matcher(value);
  if ( !m.find() )
    return false;
  return true;
}

対象文字列が null の場合、Matcher クラスで NullPointerException が発生します。そのため、対象文字列が null もしくは 空文字列の場合は return false としています。

Pattern p = Pattern.compile("^([0-1][0-9]|[2][0-3]):[0-5][0-9]$");

Pattern クラスに設定する正規表現は「^([0-1][0-9]|[2][0-3]):[0-5][0-9]$」としています。これにより 00:00~23:59 までの範囲をカバーできます。

テストソースを用意しました。

System.out.println("null    " + DateUtils.isTimeType(null));
System.out.println("空文字  " + DateUtils.isTimeType(""));
System.out.println("XYZ     " + DateUtils.isTimeType("XYZ"));
System.out.println("1234    " + DateUtils.isTimeType("1234"));
System.out.println("1:23    " + DateUtils.isTimeType("1:23"));
System.out.println("12:34   " + DateUtils.isTimeType("12:34"));
System.out.println("99:99   " + DateUtils.isTimeType("99:99"));
System.out.println("24:00   " + DateUtils.isTimeType("24:00"));
System.out.println("00:00   " + DateUtils.isTimeType("00:00"));
System.out.println("23:59   " + DateUtils.isTimeType("23:59"));

isTimeType メソッドは DateUtils クラスに記述しています。

結果はこんな感じになります。

null    false
空文字  false
XYZ     false
1234    false
1:23    false
12:34   true
99:99   false
24:00   false
00:00   true
23:59   true

おや?「1:23」は時刻型ではないという判定が出ていますね。このメソッドでは「01:23」でないと時刻型として認められていません。もし「1:23」も時刻型としたい場合は、ちょっと工夫が必要です。まず、以下のようなメソッドを用意します。

/**
 * 指定された文字列の最後から指定された文字列長の文字列を返します。
 *
 * @param value 基となる文字列
 * @param length 返す文字列の文字列長
 * @return 基となる文字列の最後から指定された文字列長の文字列
 */
public static String rightstring(String value, int length) {
  try {
    if ( value.length() >= length )
      return value.substring(value.length() - length);
    else
      return value.substring(1);
  } catch ( Exception e ) {
    return value;
  }
}

対象文字列の右側から指定した桁数分だけ値を取得するというメソッドになります。これらの詳しい説明は「Java 左から右から指定された文字数を取得する方法」で紹介していますのでチェックしてみてください。

本題に戻りましょう。

このメソッドを使って「1:23」の先頭に"0"を付けて「01:23」とし、右から5桁の値を取得して評価すれば、時刻型として認められるという方法です。

isTimeType メソッドの以下の部分を変更します。

Matcher m = p.matcher(value);

↓↓↓↓↓

Matcher m = p.matcher(rightstring("0"+value, 5));

念のため修正したソースを残しておきます。

/**
 * 指定された文字列が時刻型かどうかを返します。
 *
 * @param value 文字列
 * @return true:正常, false:異常
 */
public static boolean isTimeType(String value) {
  if ( value == null || "".equals(value) )
    return false;
  Pattern p = Pattern.compile("^([0-1][0-9]|[2][0-3]):[0-5][0-9]$");
  Matcher m = p.matcher(rightstring("0"+value, 5));
  if ( !m.find() )
    return false;
  return true;
}

では、改めてもう一度テストします。テストソースは上述のものと同じです。

結果はこうなります。

null    false
空文字  false
XYZ     false
1234    false
1:23    true
12:34   true
99:99   false
24:00   false
00:00   true
23:59   true

はい、「1:23」も時刻型として認められました。どちらを使うかは仕様に合わせて検討してくださいね。

まとめ

Javaで時刻型(HH:mm)かどうかをチェック方法を紹介しました。

Pattern クラスと Matcher クラスは時刻型のチェック以外にも利用されますので、しっかり覚えておきましょう。時間管理は実務の中で重要な役割を担っています。もちろん今回ご紹介した以外の方法でもチェック方法があると思います。いろいろ探してベストな方法を見つけてください。

今回紹介した方法で不具合などあればコメントで指摘いただけると助かります。

おつかれさまでした。

この記事がお役に立ちましたら シェア をお願いいたします。