- PR -

経過時間の算出法

1
投稿者投稿内容
じん君
会議室デビュー日: 2001/12/25
投稿数: 9
投稿日時: 2001-12-25 21:22
最近Javaを独学で勉強しているのですが、DBから取得した開始時間から終了時間への経過時間をどのように算出するのかわかりません。次のようにすると
 java.sql.Time startTime; //開始時間
 java.sql.Time endTime;  //終了時間
java.sql.Time working = new java.sql.Time(0,0,0);
 long result;        
 ここでResultSetより開始時間と終了時間を取得する
 result = endTime.getTime() - startTime.getTime();
System.out.println("経過時間 = " + working.setTime(result).toString());
とすればよいと思ったのですが、setTimeのタイミングで09:00:00が初期値のようにセットされ
てしまいます。根本的に間違っているのかもしれないのですがアドバイスをお願いいたします。
miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2001-12-26 12:08
引用:

result = endTime.getTime() - startTime.getTime();
System.out.println("経過時間 = " + working.setTime(result).toString());
とすればよいと思ったのですが、setTimeのタイミングで09:00:00が初期値のようにセットされ
てしまいます。根本的に間違っているのかもしれないのですがアドバイスをお願いいたします。




setTime(long)には時間の流れの中の一点である時刻を指定するのであって、経過時間という量を指定するのではないと思います。

次のようなやり方はよく見かけます。
ユーティリティクラスを自前で定義した方がよさそうですね。

long startTime = System.currentTimeMillis();
...
long endTime = System.currentTimeMillis();
System.out.println("経過時間 = " + (endTime - startTime) + "ms.");

まりり
ぬし
会議室デビュー日: 2001/12/05
投稿数: 329
投稿日時: 2001-12-26 13:07
ここでいう、開始時間終了時間というのはDBのレコード中から取り出すんですよね?
で、差がとりたい。

だとしたら、単純に
result = endTime.getTime() - startTime.getTime();
System.out.println("経過時間 = " + new Date(result));
でいいのではないです?(試してないですが)
日付の書式を変えたければjava.test.SimpleDateFormatあたりを使う。

そうではなくて、処理にかかった時間が知りたいのだったら、mikiさんの方法ですね。
じん君
会議室デビュー日: 2001/12/25
投稿数: 9
投稿日時: 2001-12-26 22:53
mikiさん、まりりさんアドバイスありがとうございます。
DBより取得した2つの時間差を算出して文字列で確認したいのです。まりりさんのアドバイスも試した(DateをTimeに変えました)のですが、やはり意図した結果が得られません。
 startTime = rs.getTime("START_TIME");
System.out.println("START_TIME = " + startTime.toString());
endTime = rs.getTime("END_TIME");
System.out.println("END_TIME = " + endTime.toString());
result = endTime.getTime() - startTime.getTime();
System.out.println("経過時間 = " + new java.sql.Time(result));
とするとコンソール上に
 START_TIME = 10:00:00
 END_TIME = 12:00:00
 経過時間 = 11:00:00
と表示されます。経過時間が2:00のはずが11:00となっています。ちなみに、startTime、endTime、resultはそれぞれ3600000、10800000、7200000となっていて正しいようです。
これが、”はまる”ということなんですね。
じん君
会議室デビュー日: 2001/12/25
投稿数: 9
投稿日時: 2001-12-26 23:01
さらに、こんなことをしてみたら
 System.out.println(new java.sql.Time(1000));
コンソールには
 09:00:01
と帰ってきました。
VisualAge4.0を使用しているのですが、ひょっとして環境の問題なのでしょうか?。
miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2001-12-26 23:37
引用:

じん君さんの書き込み (2001-12-26 22:53) より:
 経過時間 = 11:00:00
と表示されます。経過時間が2:00のはずが11:00となっています。ちなみに、startTime、endTime、resultはそれぞれ3600000、10800000、7200000となっていて正しいようです。
これが、”はまる”ということなんですね。



java.sql.DateのJavaDocに次のような説明があります。

「ミリ秒の値をラップする薄いラッパーであり、これによって JDBC がミリ秒の値を SQL DATE として扱うことができるようになります。ミリ秒の値は、1970 年 1 月 1 日 グリニッジ標準時 00:00:00.000 からの経過時間をミリ秒で表した数値です。 」

じん君さんは、1970年1月1日から7200000ms後のDateのインスタンスを作成しようとしています。そして、経過時間の表示は特にタイムゾーンの指定をしていませんからデフォルトの日本時間(つまりグリニッジ標準時から+9時間後)でおこなわれます。したがって、7200000ms(2時間)+9時間=11時間で正しいのです。

しかし、new java.sql.Time(7200000)というインスタンスが意味しているのは、グリニッジ標準時の1970年1月1日の11:00という「時刻」以外の何物でもありませんから、「経過時間」の意味として使うのは適切ではないでしょう。これが私の前のメッセージで言いたかったことです。

それでも、タイムゾーンを変更してDateの表示をしたければjava.util.DateFormatが使えます。



じん君
会議室デビュー日: 2001/12/25
投稿数: 9
投稿日時: 2002-01-05 19:34
返事が遅れましたが、アドバイスを元に以下で解決しました。正しいかはわかりませんが・・・。

java.text.DateFormat df = java.text.DateFormat.getTimeInstance();
df.setTimeZone(java.util.TimeZone.getTimeZone("GMT"));
System.out.println(df.format(ResultTime));

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)