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

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

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

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

Q&A

2回答

1410閲覧

JavaScriptでの、時間計算(繰り上げ繰り下げ)の方法

tamatama

総合スコア6

JavaScript

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

0グッド

1クリップ

投稿2018/01/17 12:34

###前提・実現したいこと
秒数(単位はms)データを使用し、基準として用意した時間に足したり引いたりしたい。
秒数データは、マイナス(-)の値も含まれている。

###発生している問題・エラーメッセージ
①時間の繰り上げが行われていない(具体的に、分、秒が60秒に到達しても繰り上げが行われない)
②秒数データがマイナスの時に正しく動作しない。
③補足的に・・・最終的に時分秒すべてを二桁で格納したい(例.5分⇒05分としたい)

###宣言

JavaScript

1var maindata = [3509080 , 8590 , -34458 , 4545853]; //秒数のみで表した元データ [単位は ミリ秒(ms)] 2var databox = new Array(); //maindataの数値を分解 3var h, m, s, x; //時,分,秒,テンポラリ変数

###時間計算

JavaScript

1for(var i=0 ; i<maindata.length ; i++){ 2 //時間の初期値(これに加算していく) 3 var hh = [13]; //時 4 var mm = [47]; //分 5 var ss = [00]; //秒 6 7 x = maindata[i] / 1000; 8 s = Math.round(x % 60); //秒 (小数点以下は四捨五入) 9 10 x /= 60; 11 m = Math.floor(x % 60); //分 12 13 x /= 60; 14 h = Math.floor(x % 24); //時 15 16 //加算後の時分秒 (配列の数値に足し算) 17 hh[0] += h; 18 mm[0] += m; 19 ss[0] += s; 20 21 //値を配列に入れる 22 databox.push({h : hh[0] , m : mm[0] , s : ss[0]}); 23}

###出力

JavaScript

1//値を出力する 2for(var j=0 ; j<databox.length ; j++){ 3 console.log(databox[j]); 4}

###試したこと
問題①、②に関しては原因が分からず手が付けられませんでした。
問題③では、配列に格納する時点、

JavaScript

1databox.push({h : ('00'+hh[0]).slice(-2) , m : ('00'+mm[0]).slice(-2) , s : ('00'+ ss[0]).slice(-2)});

を実行してみたのですが、計算で取得できている値が正しくないため合っているのか"???"となってしまいました。

###補足情報(言語/FW/ツール等のバージョンなど)
言語:JavaScritpのみ
ブラウザ:Google Chrome
OS : Windows7

必要情報等ありましたら補足させていただきますので、よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

様々なライブラリーにおいて特定の時刻や時間間隔を表現するのに時、分、秒の値を個別に保持せず秒あるいはミリ秒の単位での単一の数値を用いることが多いと思います。年、月、日、時、分、秒をそれぞれ独立に操作できるようなものもありますが・・・。

なぜそうしているかといえば四則演算の実装が単純だからと思います。質問者さんの実装方針でも実現は可能ですが「負号の違いによる剰余、切り捨てのまるめ方向、時、分、秒それぞれに対する桁上がり」などに配慮しなくてはならない点が若干面倒に感じます。

そこで時、分、秒それぞれを累算するのではなく、基準時刻を最初からミリ秒単位で表現しておき、それに経過時間を単純加算しつつループの各段階での個々の時刻(を表すミリ秒単位の数値)を毎回望む形式にエンコードした方が考え方として分かり易い気がします。

javascript

1function encodeHMS(t) { 2 var s = Math.floor(t / 1000), 3 m = Math.floor(s / 60), 4 h = Math.floor(m / 60); 5 return { h: h, m: m % 60, s: s % 60 }; 6} 7 8var maindata = [3509080 , 8590 , -34458 , 4545853]; 9var t = (((13 * 60 + 47) * 60) + 0) * 1000; 10var databox = maindata.map(function (timeSpan) { 11 t += timeSpan; 12 return encodeHMS(t); 13}); 14console.log(databox); 15 16==> 17[ { h: 14, m: 45, s: 29 }, 18 { h: 14, m: 45, s: 37 }, 19 { h: 14, m: 45, s: 3 }, 20 { h: 16, m: 0, s: 49 } ]

ところでhh, mm, ssがなぜ配列でなければならないのか自分には読み取れませんでした。質問者さんの意図を読み取りそこねているかも知れません。

投稿2018/01/17 14:10

KSwordOfHaste

総合スコア18394

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

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

0

変数の値をトレースしていけば、デバッグしやすいと思います。

繰り上げ処理の後に加算をしているのが原因です。

js

1 var mm = [47]; //47分 2//... 3 x /= 60; 4 m = Math.floor(x % 60); //58分 5//... 6 mm[0] += m; // 47+58=105分

①と同様です。基準時刻をms単位に直してから元データと演算し、それからhhmmssにするのがいいのでは。

当方の環境では、動作しています。



ご存知とは思いますが、Dateオブジェクトを使った方が楽かな、と思います。
Date - JavaScript | MDN
以前、時刻をゼロパディングする際の注意点をQiitaに書きましたので、ご参考になれば幸いです。
時刻表示をゼロパディングする方法と、日本語ロケールの不思議な挙動について - Qiita

投稿2018/01/17 14:07

編集2018/01/17 14:10
Lhankor_Mhy

総合スコア36115

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問