🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

Q&A

解決済

3回答

2865閲覧

ミリ秒から時分秒への変換

yoshimatsu

総合スコア8

JavaScript

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

0グッド

1クリップ

投稿2019/10/09 00:41

1秒毎にカウントダウンするプログラムを作成中です。
例えば残り時間が分の切り替わりの1時間1分0秒になった時に3660000ミリ秒ではなく3659999ミリ秒のように誤差が発生した場合うまく行きません。

JavaScript

1 let t = 3659999;//残り時間ミリ秒 2 3 let h = Math.floor(t / 3600000);//時間 4 let m = Math.floor((t - h * 3600000) / 60000);//分 5 let s = Math.round((t - h * 3600000 - m * 60000) / 1000);//秒 6 console.log(h + "時間" + m + "分" + s + "秒");//1時間0分60秒 7 8 s = Math.floor((t / 1000) % 60);//秒 9 m = Math.floor((t / 1000 / 60) % 60);//分 10 h = Math.floor((t / 1000 /60 /60) % 24);//時間 11 console.log(h + "時間" + m + "分" + s + "秒");//1時間0分59秒

残り時間に100ミリ秒など誤差分を足す方法しか思いつかないのですが、他の方法はありますでしょうか?

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

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

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

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

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

yambejp

2019/10/09 00:53

結局 t = 3659999はなんと表示されればよいのでしょうか?
y_waiwai

2019/10/09 00:59

うまくいかないとはどうなるんでしょうか
yoshimatsu

2019/10/09 01:19

1時間1分0秒と表示したいです。 1時間0分60秒あるいは1時間0分59秒と表示されます。 ただし分の切り替えでは無い時には問題ありません。
yambejp

2019/10/09 01:32 編集

あらかじめtを処理するのが効率的です 回答の方を参考にしてください
Lhankor_Mhy

2019/10/09 01:32

個人的には「1時間0分59秒」は妥当のように思えるのですが、yoshimatsuさんはどのように表示したいのですか?
yoshimatsu

2019/10/09 02:16

1時間1分0秒と表示したいです。
Lhankor_Mhy

2019/10/09 02:26

3659941 の場合はどうなりますか? 3659971 は?
yoshimatsu

2019/10/09 02:52

どちらの場合も1時間1分0秒と表示したいです。
Lhankor_Mhy

2019/10/09 03:10 編集

ああ、いや、間違いました。すみません。 3659001 と 3659501 の時はどうですか?
yoshimatsu

2019/10/09 03:16

3659001は1時間0分59秒、3659501は1時間1分0秒です。 3659501までのズレは無いようにしたいと思っています。
yambejp

2019/10/09 03:21 編集

> 3659501までのズレ 四捨五入から考えると 3659499=3659000 3659500=3660000 ですよね? でも0.5秒は誤差というには無理があります。考え直したほうがよいです
Lhankor_Mhy

2019/10/09 03:22

では、現在ついているご回答で問題は特にないのですね。わかりました。
Zuishin

2019/10/09 03:37

四捨五入だと残り 1.5 秒で 1 になり、残り 0.5 秒で 0 になりますね。1 時間以上かかる仕事なので、画面が切り替わるのであれば好みの問題かなとは思いました。人間がカウントする時には 0 になった後に何かを始めるのにいくばくかの間が空くと思いますので。 ただし内容によってはこの間を気持ち悪いと思う人もいると思います。画面を凝視していて、残り 0 秒でわずかでも停止したら、そこで肩透かしを食らわされたように思う人もいるでしょう。
guest

回答3

0

最初の表示のときだけ、小数点以下のいくつかで四捨五入しといて(表示する桁数で四捨五入)、実際のカウントではリアルな値にしておけばいいんではないかと。

投稿2019/10/09 01:43

y_waiwai

総合スコア88040

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

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

yoshimatsu

2019/10/09 02:53

ありがとうございます。他の方のご回答も拝見したいと思います。
yoshimatsu

2019/10/10 01:22

ミリ秒を秒に変えてから小数点以下を四捨五入する予定です。この案を最初にいただきましたyambejp様をベストアンサーとさせていただきます。
guest

0

let s = Math.round((t - h * 3600000 - m * 60000) / 1000);//秒

Math.floor にすれば一致します。
「うまくいきません」の内容がわからないので、一致しないのが問題だと思いました。

追記

元のコードをあまり変えずにするならこのようになります。先にまるめておきます。

JavaScript

1let t = 3659999;//残り時間ミリ秒 2 3let t2 = Math.round(t / 1000); 4let h = Math.floor(t2 / 3600); 5let m = Math.floor((t2 - h * 3600) / 60); 6let s = Math.floor(t2 - h * 3600 - m * 60); 7console.log(h + "時間" + m + "分" + s + "秒");//1時間1分0秒

投稿2019/10/09 00:47

編集2019/10/09 01:54
Zuishin

総合スコア28669

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

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

yoshimatsu

2019/10/09 01:45

let s = Math.floor((t - h * 3600000 - m * 60000) / 1000); の場合はt=3659999は1時間0分59秒になってしまいます。 1時間1分0秒と表示させたいです。 また分の切り替えが無い時はMath.roundの場合は 1時間0分58秒にt=3657999となっても1時間0分57秒ではなく1時間0分58秒と表示され望ましいです。
yoshimatsu

2019/10/09 02:23

追記いただいた方法はyambejp様と同様な方法かと思われます。もう少し他の人のご教示を拝見したいと思います。
yoshimatsu

2019/10/10 01:22

ミリ秒を秒に変えてから小数点以下を四捨五入する予定です。この案を最初にいただきましたyambejp様をベストアンサーとさせていただきます。
guest

0

ベストアンサー

例えばこんな感じ(現時刻を表示)

javascript

1var t = new Date().getTime()% (60*60*24*1000)/1000 + 9*60*60; 2var h = parseInt(t/60/60); 3var m = parseInt(t/60)%60; 4var s = parseInt(t)%60; 5console.log(h + "時" + m + "分" + s + "秒"); 6t=Math.round(t); 7h = parseInt(t/60/60); 8m = parseInt(t/60)%60; 9s = parseInt(t)%60; 10console.log(h + "時" + m + "分" + s + "秒");

予めミリ秒を秒に変えてroundするかどうかで四捨五入の処理がされます
ただし、四捨五入するということは0.5秒前に未来時間を表示してしまうということなので
あまりおすすめはできません

調整

ようはしきい値をどうするか次第ですね

javascript

1var t = 3659999; 2t=((t%1000>=995)?Math.round(t/1000):Math.floor(t/1000))*1000; 3console.log(t); // 3660000 4var t = 3659995; 5t=((t%1000>=995)?Math.round(t/1000):Math.floor(t/1000))*1000; 6console.log(t); // 3660000 7var t = 3659994; 8t=((t%1000>=995)?Math.round(t/1000):Math.floor(t/1000))*1000; 9console.log(t); // 3659000

誤差の調整はできても前述した通り達していない未来日時を表示するのは
ただしいとは言えません。
setIntevalなどで時間をとるならループのタイミングを短くするなど
運用面で対応を考えるべきです

投稿2019/10/09 01:11

編集2019/10/09 02:42
yambejp

総合スコア116694

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

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

yoshimatsu

2019/10/09 02:02

ありがとうございます。他の方のご回答も拝見したいと思います。
yambejp

2019/10/09 02:43

一応追記しておきましたが運用の問題だと思います
yoshimatsu

2019/10/10 01:04

ミリ秒を秒に変えてから小数点以下を四捨五入する予定です。 1秒毎にカウントダウンするプログラムは、人が次の作業、時刻、残り時間などを知ることを目的としたものなので、3659994ミリ秒も1時間1分0秒とする方が都合がいいです。 ご指摘いただいた通り本来の秒の切り替わりから大きく狂わないように、ループのタイミングを調整するようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問