経過時間を"HH:mm:ss.SS"で表示する方法

4393 views
Skip to first unread message

hirosasemashi

unread,
Apr 9, 2012, 11:07:37 AM4/9/12
to 日本Androidの会
hirosasemashiと申します。

以下サイトの「2.タイマー処理」を参考に経過時間(ミリ秒まで)を計測する処理は実装することができたのですが、この経過時間の表示
を"HH:mm:ss.SS"にしたいと考えております。

【経過時間の参考サイト】
http://techbooster.jpn.org/andriod/application/934/

SimpleDateFormatを使えばできそうな気がしたのでチャレンジしてみたのですが、
うまく実装できずに困っています。

やり方をご存知の方がいらっしゃいましたらご教示いただけますでしょうか。
よろしくお願いいたします。

Hirokazu Fukami

unread,
Apr 9, 2012, 11:21:53 AM4/9/12
to android-g...@googlegroups.com
こんばんはfkmです。

Android上で動かしてないのでだめかもですが、こんな感じでしょうか?

Date date = new Date(1238877); // 単位はミリ秒
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss.SS");
System.out.println(format.format(date));

2012/4/10 hirosasemashi <masasehi...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>

--
-------------------------------------------------------------
深見 浩和(Hirokazu Fukami)

URI:http://fkm.s266.xrea.com/
email:
f-m...@users.sourceforge.jp
f_h...@hotmail.co.jp
fkm...@gmail.com

hirosasemashi

unread,
Apr 9, 2012, 12:27:54 PM4/9/12
to 日本Androidの会
fkmさん、こんばんは。
早速の返信ありがとうございます。

以下が現在書いている試作コードなのですが、アドバイスいただいた内容をどこに入れればよいかわかりません。
重ね重ね恐縮ですが、ご教示いただけますでしょうか。

-----以下、試作コード
package test.stopwatch.v2;

import java.math.BigDecimal;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class Test_stopwatch_v2Activity extends Activity implements
OnClickListener{

TextView mTextView;
Button mStartBtn, mStopBtn;
float mLaptime = 0.00f;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//IDの取得
mTextView = (TextView) findViewById(R.id.LapTime);
mStartBtn = (Button) findViewById(R.id.StartBtn);
mStopBtn = (Button) findViewById(R.id.StopBtn);

mStartBtn.setOnClickListener(this);
mStopBtn.setOnClickListener(this);

}

class MyTimerTask extends TimerTask{

@Override
public void run() {
// mHandlerを通じてUI Threadへ処理をキューイング
mHandler.post( new Runnable() {
public void run() {

//実行間隔分を加算処理
mLaptime += 0.01d;

//計算にゆらぎがあるので小数点第2位で丸める
BigDecimal bi = new BigDecimal(mLaptime);
float outputValue = bi.setScale(2,
BigDecimal.ROUND_HALF_UP).floatValue();

//現在のLapTime
mTextView.setText(Float.toString(outputValue));
}
});
}
}

MyTimerTask timerTask = null;
Timer mTimer = null;
Handler mHandler = new Handler();

public void onClick(View v){
Button btn = (Button)v;

switch( btn.getId() ){

//スタートボタンが押されたとき
case R.id.StartBtn:

if(mTimer == null){

//タイマーの初期化処理
timerTask = new MyTimerTask();
mLaptime = 0.00f;
mTimer = new Timer(true);
mTimer.schedule( timerTask, 10, 10);
}
break;

//ストップボタンが押されたとき
case R.id.StopBtn:
if(mTimer != null){
mTimer.cancel();
mTimer = null;
}
break;

default:
break;

}

}
}
------ここまで

On 4月10日, 午前12:21, Hirokazu Fukami <fkm...@gmail.com> wrote:
> こんばんはfkmです。
>
> Android上で動かしてないのでだめかもですが、こんな感じでしょうか?
>
> Date date = new Date(1238877); // 単位はミリ秒
> SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss.SS");
> System.out.println(format.format(date));
>
> 2012/4/10 hirosasemashi <masasehiroshi1...@gmail.com>:
>
>
>
>
>
>
>
>
>
> > hirosasemashiと申します。
>
> > 以下サイトの「2.タイマー処理」を参考に経過時間(ミリ秒まで)を計測する処理は実装することができたのですが、この経過時間の表示
> > を"HH:mm:ss.SS"にしたいと考えております。
>
> > 【経過時間の参考サイト】
> >http://techbooster.jpn.org/andriod/application/934/
>
> > SimpleDateFormatを使えばできそうな気がしたのでチャレンジしてみたのですが、
> > うまく実装できずに困っています。
>
> > やり方をご存知の方がいらっしゃいましたらご教示いただけますでしょうか。
> > よろしくお願いいたします。
>
> > --
> > このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> > このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> > このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。
>
> --
> -------------------------------------------------------------
> 深見 浩和(Hirokazu Fukami)
>
> URI:http://fkm.s266.xrea.com/
> email:
> f-m...@users.sourceforge.jp
> f_hy...@hotmail.co.jp
> fkm...@gmail.com

yos-mas

unread,
Apr 11, 2012, 8:08:44 AM4/11/12
to android-g...@googlegroups.com
AndroidにMediaControllerというクラスがあり、
その中にstringForTime(int timeMs)というメソッドがあります。
(privateメソッドなので、ソースがないと見られませんが)

これは、intの値で時間(ミリ秒)でもらって、
それをHH:mm:ssまたはmm:ss形式のStringにして返すものです。
動画や音楽の長さを表示するために使われています。

以下のようになっています。

// 以下2行はコンストラクタで初期化
StringBuilder mFormatBuilder = new StringBuilder();
Formatter mFormatter = new Formatter(mFormatBuilder, Locale.getDefault()); // java.util.Formatterクラス

private String stringForTime(int timeMs) {
    int totalSeconds = timeMs / 1000;

    int seconds = totalSeconds % 60;
    int minutes = (totalSeconds / 60) % 60;
    int hours   = totalSeconds / 3600;

    mFormatBuilder.setLength(0);
    if (hours > 0) {
        return mFormatter.format("%d:%02d:%02d", hours, minutes, seconds).toString();
    } else {
        return mFormatter.format("%02d:%02d", minutes, seconds).toString();
    }
}

少し改造すれば目的のものが実装できるのではないかと思います。
参考になれば幸いです。

2012年4月10日火曜日 1時27分54秒 UTC+9 hirosasemashi:
> > このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。
> > このグループから退会するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信してください。

yos-mas

unread,
Apr 11, 2012, 8:15:11 AM4/11/12
to android-g...@googlegroups.com
すみません。
> // 以下2行はコンストラクタで初期化
は無視してください。勘違いでした。

2012年4月11日水曜日 21時08分44秒 UTC+9 yos-mas:

hirosasemashi

unread,
Apr 11, 2012, 11:34:55 AM4/11/12
to 日本Androidの会
yos-masさん

ありがとうございます。
mediaControllerについて調べてみました。
yos-masさんが書かれています通り、動画の再生時間の表示などに使われるもののようですが
今回はストップウォッチ形式を実装したいと考えております。

この場合でもmediaControllerを応用することで対応可能でしょうか?
> >> > > このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> >> > > このグループから退会するには、android-group-j...@googlegroups.comにメールを送信してください。

yos-mas

unread,
Apr 12, 2012, 12:28:41 PM4/12/12
to android-g...@googlegroups.com
前述のstringForTimeメソッドのようなものを実装して、
TextViewにセットすれば行けると思います。
floatで時間を設定してるので、
引数はfloatに変えたほうがいいかもしれないです。

private String stringForTime(float time) {
    // "HH:mm:ss.SS"形式でStringを返すように実装
}

で、タイマー処理のところで、
mTextView.setText(stringToTime(outputValue));
のような感じでどうでしょうか。

すみません、stringForTimeの処理は
うまいこと思いつかなかったです。

宜しくお願いします。

2012年4月12日木曜日 0時34分55秒 UTC+9 hirosasemashi:
> >> > > このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。
> >> > > このグループから退会するには、android-group-japan+unsubscribe@googlegroups.comにメールを送信してください。

Kenichi YOKOSHIMA

unread,
Apr 13, 2012, 8:22:40 AM4/13/12
to android-g...@googlegroups.com
初めまして、横島といいます。

ちょうど似たようなことやっていたのでご参考になれば。
外部ライブラリを使用しても良いのであれば、commons-langにDurationFormatUtilsというのがあります。


使い方はこんな感じです。

String time = DurationFormatUtils.formatDuration(lap, "mm:ss.S", true);

lapは経過ミリ秒でlong型です。
これで「00:00.000」のような感じの文字列が取れます。

ご参考のコードでは、経過時間をfloat型で扱っているようなので、long型に改造すればそのまま使えるのではないでしょうか。(というか、long型でやったほうが自然じゃないかな?)

私の場合は「00:00.0」で表示させたかったのでsubstringで下二桁削ったりしました。

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。

スモーカーズ・アイランド

unread,
Apr 13, 2012, 10:11:29 AM4/13/12
to android-g...@googlegroups.com
はじめまして。私が実際に自分が作成したアプリで実装したコードの一部を公開します。参考になれば良いのですが。

-----*****-----*****-----*****-----*****-----*****-----*****-----*****-----*****-----*****-----*****-----
public String onCount(long time){
final TimeZone zone = TimeZone.getDefault(); //時間表示の調整用
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String timeLabel = sdf.format(time  - zone.getRawOffset());
return timeLabel;
}
-----*****-----*****-----*****-----*****-----*****-----*****-----*****-----*****-----*****-----*****-----

かなり雑なやり方ですが、関数が受け取るlong値は別の関数で計算された値ですので割愛します。
一行目で実機のタイムゾーンを取得し、二行目で「00:00:00」表示するためにSimpleDateFormatを定義します。
三行目ではStringにSimpleDateFormat形式で値を渡すのですが、そのままtimeを渡してしまうと、timeの値に実機のタイムゾーンの値が加算されて表示されます。
そこで、一行目で取得したタイムゾーンをtimeから引いた値をSimpleDateFormat.formatに渡します。
この関数で得た値を、実際に画面に表示させる処理に渡すことで、私の場合はカウントダウンするように表示させています。
TimeZoneの値を取得する事で、実機のタイムゾーンをどこに変更しても、timeの値が0の場合は「00:00:00」で表示されます。

2012年4月10日火曜日 0時07分37秒 UTC+9 hirosasemashi:

hirosasemashi

unread,
Apr 15, 2012, 4:10:35 AM4/15/12
to 日本Androidの会
みなさま

いろいろとアドバイスいただきありがとうございます。
現在、再挑戦中です。
出来たらご報告します!
Reply all
Reply to author
Forward
0 new messages