- PR -

二つのjava.util.Dateの時間差を”HH:mm:ss”形式で求めたい

1
投稿者投稿内容
eiwuser
会議室デビュー日: 2004/05/11
投稿数: 13
投稿日時: 2004-05-11 17:11
こんにちは。

下記のロジックで二つのDateの時間差を”HH:mm:ss”形式で求めたいのですが
実行結果は

経過時間:09:01:30

となってしまいます。
(期待する結果は、00:01:30 )

対処法をご存知でしたら宜しくお願いします

sample_1.java
-----------------------------------------------------------------------

import java.util.*;
import java.text.*;
/**
*
*
* @author
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class sample_1 {

public static void main(String[] args) throws Exception {
SimpleDateFormat formatter = new SimpleDateFormat ("yy/MM/dd HH:mm:ss");
Date startDate = formatter.parse("04/05/11 17:00:00"); // 開始時刻
Date endDate = formatter.parse("04/05/11 17:01:30"); // 終了時刻

long diffTime = endDate.getTime() - startDate.getTime();

// 結果出力用フォーマット
SimpleDateFormat timeFormatter = new SimpleDateFormat ("HH:mm:ss");

String diffTimeStr = timeFormatter.format(new Date(diffTime));

System.out.println("経過時間:" + diffTimeStr);
}
}

-----------------------------------------------------------------------
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2004-05-11 17:47
引用:

下記のロジックで二つのDateの時間差を”HH:mm:ss”形式で求めたいのですが
実行結果は

経過時間:09:01:30

となってしまいます。
(期待する結果は、00:01:30 )



原因はなぜかというと、DateやDateFormatは時間ではなく、
時刻を扱うためのクラスだからです。
年月日も表示すればわかりますが、この場合、
GMTでの「1970/01/01 00:01:30」になってるわけです。
9時間は、日本標準時との時差なんですね。

ロジックとしては、diffTimeを、順番に60や24で割って、商と剰余を求めていくのが正しいかと。
あるいは、SimpleDateFormatのインスタンスを生成するときに、
コンストラクタに英国のLocaleを与えれば、所定の目的は達せるんではないでしょうか。
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2004-05-11 18:04
原因はEdossonさんのとおりなんで
後はタイムゾーンをGMTとすればずれは直ります。

SimpleDateFormat の次に下記追加してみて下さい。
timeFormatter.setTimeZone(TimeZone.getTimeZone("GMT"));

後、SimpleDateFormat timeFormatter = new SimpleDateFormat ("HH:mm:ss Z");
でタイムゾーンを表示すればずれがはっきりわかりますね。


[ メッセージ編集済み 編集者: いっきゅう 編集日時 2004-05-11 18:08 ]
eiwuser
会議室デビュー日: 2004/05/11
投稿数: 13
投稿日時: 2004-05-11 18:45
返信ありがとうございました。

timeFormatter.setTimeZone(TimeZone.getTimeZone("GMT"));
を追加することで目的の動作を確認できました。

ただ、日をまたぐ場合の計算がうまくいかないので、
おっしゃるとおりdiffTimeを、順番に60や24割る方法を
使うのが正しいようです。
1

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