時刻の表示について
時刻とそのフォーマットについて簡単に説明しておきましょう。前述のサンプルでは、現在の日時の値を取得してから、フォーマットを指定して文字列に変換し、画面に表示しています。
Calenderインスタンスの取得
一般的に、日付の取得にはカレンダーに従って日時を表すCalendarクラスを利用します。Javaでは、日時の値というのはDateクラスというものを使って表現されるようになっています。CalendarはこのDateを内部に持って、特定のカレンダーに従って日時の値を管理するクラスです。Calendarクラスのインスタンス取得を行う際は、newによる生成ではなく、getInstanceメソッドを利用します。
[変数] = Calendar.getInstance( [Locale] );
getInstanceメソッドの引数には、時刻を取得したい地域を示すLocaleインスタンスを指定することができます。日本の時刻を取得したい場合は、引数にLocale.JAPANを指定します。ちょうどサンプルコードでは日本を指定していますね。Localeインスタンスの指定は省略することも可能です。
Calendarクラスに類似するものとして、グレゴリオ暦のカレンダーで日時を表現するためのGregorianCalendarクラスがあります。GregorianCalendarはCalendarのサブクラスで、一般的な西暦日時を扱いたい場合に利用します。興味ある方は調べてみるとよいでしょう。
日時情報のフォーマット
さて、Calendarインスタンスから時刻を取得する際はDateFormatクラスを利用します。DateFormatは、Date型の引数を受け取り、指定のフォーマットに整形した文字列を返してくれるクラスです。引数に渡すDateオブジェクトは、CalendarのgetTimeメソッドというものを使って得ることができます。
ただし、このDateFormatは、「抽象クラス」と呼ばれる特殊なクラス(直接、インスタンスを作ったりできない特別なクラス)として定義されており、このクラスを直接利用できないようになっています。一般的にはDateFormatクラスを継承したSimpleDateFormatというクラスを利用するのが基本と考えてよいでしょう。
SimpleDateFormatクラスはインスタンス生成時に、取得したいフォーマットをString型で引数に指定します。TimeLabelクラスのコンストラクタを見るとこんな行が書かれていますね。
format = new SimpleDateFormat("HH:mm:ss");
ここでは、日時の値をHH:mm:ss形式で表すためのインスタンスを生成しています。引数で指定している記号はそれぞれ次のような意味を示します。サンプルコードのように記号を2つ並べると、対応する日時の要素が2桁で表示されます。
| 記号 | 意味 |
| H | 24時間表記による時の値 |
| m | 分の値 |
| s | 秒の値 |
Calendarインスタンスの取得から、SimpleDateFormatインスタンスを使って所定のフォーマットで現在時刻を取得するまでの流れを整理すると次のようになります。
Calendar calendar = Calendar.getInstance(Locale.JAPAN);
this.setText(format.format(calendar.getTime()));
これはちょうどTimeLabelクラスのsetTimeメソッドで行っている処理にあたります。まず、Calendarインスタンスを取得した後、現在の時刻をsetTextで表示しています。この部分を分解してみると、次のようになります。
- calendar.getTime()
- format.format( [Date] )
CalendarからDateインスタンスを得る。SimpleDateFormatインスタンスに指定された形式で、引数Dateの日時をフォーマットしたStringとして返す。 CalendarからDateインスタンスを取り出し、これを使ってSimpleDateFormatのformatメソッドで指定した形式の文字列を取り出していたのです。
タイマーの利用手順
では、本題であるタイマーを利用している部分について見てみましょう。サンプルコードでは、TimeLabelクラスのコンストラクタでタイマーに関する設定を行っています。
Timer t = new Timer(); t.schedule(new TimerLabelTask(), 0,1000);
まずnew TimerでTimerクラスのインスタンスを作成します。次にscheduleメソッドを使って、処理の実行スケジュールを設定します。メソッドの引数には、実行するタスク(ここではTimerTaskクラスを継承して作成したTimerLabelTaskインスタンス)、遅延時間、実行間隔を指定します。
遅延時間と実行間隔は、それぞれ「ミリ秒(1000分の1秒)」単位の数値で指定します。遅延時間が経過後、実行間隔で指定した時間が経過する度にTimerLabelTaskの処理が実行されます。
処理内容を記載した肝心のTimerLabelTaskクラスは、次のように定義されています。
class TimerLabelTask extends TimerTask { public void run(){ setTime(); } }
Timerで実行する処理は、サンプルのようにTimerTaskクラスを継承して作成します。TimerTaskのサブクラスには、runというメソッドを用意する必要があります。runメソッドには実行する処理を記述しておきます。
TimerとTimerTask、2つのクラスを使うのでちょっと面倒な気がしますが、実際にやってみるとそう複雑なものではありません。
