JavaScriptでのみHH:MM:SS文字列を秒に変換します


97

私と同様の要件があります:HH:MM:SS形式の時間を秒のみに変換しますか?

しかしJavaScriptで。秒をさまざまな形式に変換する多くの例を見ましたが、HH:MM:SSを秒に変換していません。任意の助けいただければ幸いです。


おっと。タイプミスしてすみません。はい、時間ですhh:mm:ss
Sri Reddy

何であるDDではHH:MM:DD
Brian Driscoll、2012年

2
これは、そのPHPの質問と同じアルゴリズムです。
scottheckel 2012年

うーん... H(時間)== 3600秒、M(分)== 60秒...そう...
MilkyWayJoe

1
私が考える唯一の解決策は、文字列を配列に分割し、3600を1時間に乗算し、60を最小に乗算し、すべてを秒の部分で追加することです。これは最も簡単な解決策ですか?
スリランカレディ

回答:


192

これを試して:

var hms = '02:04:33';   // your input string
var a = hms.split(':'); // split it at the colons

// minutes are worth 60 seconds. Hours are worth 60 minutes.
var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); 

console.log(seconds);

3
これはプロトタイプバージョンです。String.prototype.toSeconds = function () { if (!this) return null; var hms = this.split(':'); return (+hms[0]) * 60 * 60 + (+hms[1]) * 60 + (+hms[2] || 0); } 注:|| 0末尾のはこのコードの実装に適しています-HH:MMの(まだ有効な)時間表現の問題を防ぎます(Chromeのtype = "time"入力は、seconds = 0のときにこの形式で出力されます)。
Fateh Khalsa、2016年

素晴らしいもの
エドワード

私は持っていhh:mmないseconds私は変更する必要がどのようなこのケースでは..?
Mrワールドワイド

1
@AbdulWaheedこの行を変更します:var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); tovar seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60;
Rova

4
「+」演算子を使用して数値文字列を数値に変換することはお勧めできません。それは短く、「賢い」ように見えますが、混乱しやすく、クリーンなコードではありません。代わりにparseInt(x、10)を使用してください。ワンライナーは避けてください。未定義の入力によるエラーも防止します。例:文字列ではなく、「:」がないか、「HH:MM」のみです。など
ドミニク2017

67

この関数は、「HH:MM:SS」と「MM:SS」または「SS」を扱います。

function hmsToSecondsOnly(str) {
    var p = str.split(':'),
        s = 0, m = 1;

    while (p.length > 0) {
        s += m * parseInt(p.pop(), 10);
        m *= 60;
    }

    return s;
}

いいですね、時間が経過しても要件が出てきたら、それを維持します。ありがとう!
スリレディ2012年

これまでのところ、私にとってのベストアンサー
Rezwan Azfar Haleem 2016年

この回答は役に立ちます
マイクアロン

「HH:MM」形式のみで使用するために関数を変更する必要があるもの
noyruto88

35

これは、次のように非常に弾力的に実行できます。

'01:02:03'.split(':').reduce((acc,time) => (60 * acc) + +time);

これは、時間、分、秒内の時間の各単位が、小さい単位の60の倍数であるためです。時間は、時間の分と秒のコンポーネントに分割され、各ユニットを通過するときに、上位ユニットの累積値に60を掛けた値を使用して秒に短縮されます。

+time数に時間をキャストするために使用されます。

基本的には次のようになります。 (60 * ((60 * HHHH) + MM)) + SS

秒しか渡されない場合、結果は文字列になるため、結果全体をintにキャストできるように修正します。

+('03'.split(':').reduce((acc,time) => (60 * acc) + +time));

それは実際にはかなり賢い..問題は、これが計算とどれだけ速く比較されるかです
ThatBrianDude

4
はい、それは巧妙ですが、実用的な利益がないために維持が困難なコードを作成する良い例です。受け入れられた回答の縮小版と縮小版を比較すると、4文字が節約されます。現在、多くのWebページが1MBを超えていることを考えると、その節約は取るに足らないことよりもやや少なくなります。
RobG、

4
この回答はわかりにくいですが、との両方HH:MM:SSを適切に処理しMM:SSますが、受け入れられた回答は処理しません。
ckeeney 2018

1
秒の部分だけが指定されている場合、これには型変換のバグがあります。それを防ぐには、メモを明示的に0で開始する必要があります。機能:'03'.split(':').reduce((acc,time) => (60 * acc) + +time, 0);予期しない文字列を返すため失敗する:'03'.split(':').reduce((acc,time) => (60 * acc) + +time);
Felix Gertz

@FelixGertzよくわかりました。その場合の修正を編集します。
Paul

12

DateオブジェクトのgetTime関数は1970/01/01からのミリ秒を取得するため、これを行うことができます。

var time = '12:23:00';
var seconds = new Date('1970-01-01T' + time + 'Z').getTime() / 1000;

1
これは夏時間では機能しません。実際の日付を使用する必要がある
Yablargo 2013年

1
@Yablargoありがとう。以前のバージョンはローカルのタイムゾーンではうまく機能しなかったため、iso 8601 utc datetime形式を使用するように編集しました。
boskop 2013

12

hh:mm:ss文字列を1行で秒に変換します。また、許可されるh:m:s形式とmm:ssm:sなど

'08:45:20'.split(':').reverse().reduce((prev, curr, i) => prev + curr*Math.pow(60, i), 0)

4
回答を説明してください
B001ᛦ16年

hh:mm:ss文字列を1行で秒に変換します。また、許可されるh:m:s形式とmm:ssm:sなど
ポール隠す

素敵な答え!しかし、あなたはスキップすることができますreverse():'00:01:11'.split( ':')。reduce((val、entry、i)=> val + entry *(3600 / Math.pow(60、i))、0 )=== 71
CMR 2017年

@CMR、興味深いアプローチですが、その場合はmm:ss正しく機能しません。
Paul Hide

Math.powは非常に遅く、reduceに基づく他の回答に示されているように回避できます
Alejadro Xalabarder

8

試す

time="12:12:12";
tt=time.split(":");
sec=tt[0]*3600+tt[1]*60+tt[2]*1;

5
ああ、その* 1は文字列連結を行わないようにするための賢い方法です:)
Dagg Nabbit

5

JavaScriptの静的メソッドDate.UTC()がトリックを実行します。

alert(getSeconds('00:22:17'));

function getSeconds(time)
{
    var ts = time.split(':');
    return Date.UTC(1970, 0, 1, ts[0], ts[1], ts[2]) / 1000;
}

4

ここに、最初に承認された回答について、もう少し読みやすいフォームがあります。

const getSeconds = (hms: string) : number => {
  const [hours, minutes, seconds] = hms.split(':');
  return (+hours) * 60 * 60 + (+minutes) * 60 + (+seconds);
};

2
new Date(moment('23:04:33', "HH:mm")).getTime()

出力: 1499755980000(ミリ秒)(1499755980000/1000)(秒)

注:この出力は、1970-01-01 12:0:0から現在までの差分を計算し、moment.jsを実装する必要があります


OPはミリ秒ではなく秒数を要求しました
user7294900 2017

こんにちはuser7294900、コメントのThx私は私の答えを更新します、jst私たちは1000で除算する必要があります
ITsDEv

1

この関数はMM:SSでも機能します。

const convertTime = (hms) => {
        if (hms.length <3){
         return hms
        } else if (hms.length <6){
          const a = hms.split(':')
          return hms = (+a[0]) * 60 + (+a[1])
        } else {
          const a = hms.split(':')
          return hms = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2])
        }
      }


1

Paul https://stackoverflow.com/a/45292588/1191101によって提供されたソリューションから取得したものですが、古い関数表記を使用しているため、他のjsエンジン(java Rhinoなど)でも使用できます。

function strToSeconds (stime)
{
   return +(stime.split(':').reduce(function (acc,time) { return +(60 * acc) + +time }));
}

またはこれだけ読みやすい

function strToSeconds (stime)
{
  var tt = stime.split(':').reverse ();
  return ((tt.length >= 3) ? (+tt[2]): 0)*60*60 + 
         ((tt.length >= 2) ? (+tt[1]): 0)*60 + 
         ((tt.length >= 1) ? (+tt[0]): 0);
}

0

function parsehhmmsst(arg) {
	var result = 0, arr = arg.split(':')
	if (arr[0] < 12) {
		result = arr[0] * 3600 // hours
	}
	result += arr[1] * 60 // minutes
	result += parseInt(arr[2]) // seconds
	if (arg.indexOf('P') > -1) {  // 8:00 PM > 8:00 AM
		result += 43200
	}
	return result
}
$('body').append(parsehhmmsst('12:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('1:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('2:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('3:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('4:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('5:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('6:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('7:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('8:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('9:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('10:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('11:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('12:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('1:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('2:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('3:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('4:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('5:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('6:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('7:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('8:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('9:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('10:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('11:00:00 PM') + '<br>')
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


0

これは動的に行うことができます。HH:mm:ssだけでなく、mm:ssだけ、またはssだけの場合もあります。

var str = '12:99:07';
var times = str.split(":");
times.reverse();
var x = times.length, y = 0, z;
for (var i = 0; i < x; i++) {
    z = times[i] * Math.pow(60, i);
    y += z;
}
console.log(y);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.