質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

6206閲覧

setIntervalでミリ秒表示させたい。

ColumbiaUchida

総合スコア12

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2017/06/11 17:27

JavaScript

1var count = 120; 2 3setInterval(countDown, 1000); 4 5function countDown() { 6 count --; 7 var minutes = Math.floor(count / 60); 8 var seconds = count % 60; 9 var display = `${minutes < 10 ? '0' : ''}${minutes}:${seconds < 10 ? '0' : ''}${seconds}`; 10}

このような感じで、0埋めと秒数までは取得できるのですが、ミリ秒も取得したいです。
計算方法がわからずググってみたのですがDateオブジェクトのことばかり出てきて、わからなかったので質問させていただきました。

ご回答いただけますと大変助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ご質問のコードではインターバルが1秒単位となっているので「setIntervalが指定インターバルを正確に刻む」という前提で残り時間の表示を計算するなら、ミリ秒単位は常に"000"という前提を置くはずであり、それを表示することに意味はないと思います。

一方「ハンドラーが実際に起動された時間により残り時間をミリ秒単位で表示したい」なら、Dateにより経過時間をミリ秒単位で求めるとよいと思います。

なお、MM:ss.mmmという特別なフォーマットにするためformatMillisという関数を定義してみました。
秒以下を浮動小数点数として扱いtoFixed(3)としてもよいのですが、どのみち秒と分を2桁で0埋めする必要があるので、それ用の関数f0を定義しています。

javascript

1var startRest = 120*1000; // 初期の残り時間 2var rest = startRest; 3 4var startMs = +new Date(); 5setInterval(countDown, 1000); 6 7function countDown() { 8 var elapsed = +new Date() - startMs; 9 rest = startRest - elapsed; 10 11 var display = formatMillis(rest) 12 console.log(display) 13} 14 15// ミリ秒をMM:ss.mmm (M=分,s=秒,m=ミリ秒)の形式でフォーマットする 16function formatMillis(millis) { 17 function f0(s, n) { 18 s = "" + s; 19 return "0".repeat(Math.max(0, n - s.length)) + s; 20 } 21 var t = Math.abs(millis); 22 var ms = t % 1000; 23 var sec = Math.floor(t / 1000) % 60; 24 var min = Math.floor(t / 60000); 25 return `${millis < 0 ? "-" : ""}${f0(min, 2)}:${f0(sec, 2)}.${f0(ms, 3)}`; 26}

結果==>

01:58.985
01:57.969
01:56.969
...
00:01.965
00:00.949
-00:00.051
...

投稿2017/06/11 23:55

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ColumbiaUchida

2017/06/12 00:37

最高にわかりやすいです。ありがとうございます! Dateオブジェクトから経過を取得する方法があったのですね。 ときにf0でやっている s = "" + s; とはどういう意味でありますか? f0関数のやっていることはわかるのですが、中身が読めません????
KSwordOfHaste

2017/06/12 01:34 編集

引数は数値なのでそれを文字列へ変換する意図で""+sとしています。 文字列へ変換すると「数値を文字列として表現したとき何文字になるか」がlengthでわかりますね? そこで、期待する桁数nに足りない分だけ先頭に"0"をくっつけるようにします。Stringには同じ文字列をN回連結してくれるrepeatメソッドがあるのでこれで"00..."というのを作っています。繰り返す数が0より小さくなると調子がわるいのでMath.max(0, n - s.length)で先頭の"0"を何文字くっつけるべきかを計算している・・・という感じです。
ColumbiaUchida

2017/06/12 01:42

よくわかりました!! 丁寧に教えて頂きありがとうございます!
guest

0

1秒=1000ミリ秒ですので、基本的にはこの単位換算を加えていくだけです。

JavaScript

1/** 2 * 例1 3 */ 4// countの単位をミリ秒にして、 5var count = 120000; 6// 50ミリ秒につき、 7setInterval(countDown, 50); 8// 50ミリ秒減算 9 count -= 50; 10// 1000未満の端数が「1秒未満の残り時間(ミリ秒)」 11 count % 1000; 12 13/** 14 * 例2 15 */ 16// countの単位は秒のまま、 17var count = 120; 18// 50ミリ秒につき、 19setInterval(countDown, 50); 20// 50 ÷ 1000 = 0.05秒減算 21 count -= 0.05; 22// 1未満の端数が「1秒未満の残り時間(秒)」 23 count * 1;

投稿2017/06/11 18:28

sii_side

総合スコア849

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ColumbiaUchida

2017/06/11 23:29

さっそくご回答いただきありがとうございます。 1000ミリ秒 = 1秒ということで理解はしているのですが function countDown() { count --; } と定義しており、countを1ずつデクリメントしている状況にございます。 これをsetInterval(countDown(), 50)とし、count -= 50;とするには、どうしたらよいかわかりません。 この場合1秒を count = 1と定義している箇所の位を変更する必要があるということでしょうか? 低級な質問で申し訳ないのですが、ご返信いただけるとうれしいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問