Ubah HH: MM: string SS menjadi detik hanya dalam javascript

99

Saya memiliki persyaratan yang sama seperti ini: Ubah waktu dalam format HH: MM: SS menjadi detik saja?

tetapi dalam javascript. Saya telah melihat banyak contoh untuk mengubah detik ke format yang berbeda tetapi tidak HH: MM: SS menjadi detik. Bantuan apa pun akan dihargai.

Sri Reddy
sumber
Ups .. maaf salah ketik. ya, sudah waktunya jj: mm: dd
Sri Reddy
Apa DDdi HH:MM:DD?
Brian Driscoll
2
Ini algoritma yang sama seperti dalam pertanyaan PHP itu.
scottheckel
Nah .. H (Jam) == 3600 detik, M (menit) == 60 detik ... jadi ..
MilkyWayJoe
1
Satu-satunya solusi yang saya pikirkan adalah membagi string dalam array dan kemudian mengalikan 3600 ke jam dan mengalikan 60 ke menit dan menambahkan semua dengan bagian detik. Apakah ini solusi yang paling sederhana?
Sri Reddy

Jawaban:

194

Coba ini:

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);
Dagg Nabbit
sumber
3
Inilah versi prototipe ini! String.prototype.toSeconds = function () { if (!this) return null; var hms = this.split(':'); return (+hms[0]) * 60 * 60 + (+hms[1]) * 60 + (+hms[2] || 0); } CATATAN: || 0di bagian akhir bagus untuk implementasi apa pun dari kode ini - ini mencegah masalah dengan representasi waktu (masih valid) dari HH: MM (input Chrome type = "time" akan dikeluarkan dalam format ini saat detik = 0).
Fateh Khalsa
Hal-hal mengagumkan Bung
eddy
saya hh:mmtidak hanya secondsdalam hal ini apa yang harus saya modifikasi ..?
Mr world wide
1
@AbdulWaheed Ubah baris ini: var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); kevar seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60;
Rova
4
Penggunaan operator "+" untuk mengonversi string numerik menjadi angka bukanlah ide yang baik. Ini pendek dan terlihat "pintar", tapi itu membingungkan dan bukan kode yang bersih. Gunakan parseInt (x, 10) sebagai gantinya. Dan hindari satu baris. Juga cegah kesalahan dengan input yang tidak ditentukan. Misalnya: ini bukan string, tidak memiliki ":" atau hanya "HH: MM". dll.
Dominik
68

Fungsi ini menangani "HH: MM: SS" serta "MM: SS" atau "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;
}
Niko
sumber
Bagus, saya akan menyimpannya jika persyaratan yang muncul untuk waktu berlalu adalah format apa pun. Terima kasih!
Sri Reddy
Jawaban terbaik untuk saya sejauh ini
Rezwan Azfar Haleem
Jawaban ini berguna
Mike Aron
Apa yang saya perlukan untuk mengubah fungsi Anda untuk digunakan dalam format 'HH: MM' saja
noyruto88
39

Ini dapat dilakukan dengan cukup tangguh dengan yang berikut:

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

Ini karena setiap satuan waktu dalam jam, menit, dan detik adalah kelipatan 60 lebih besar daripada satuan yang lebih kecil. Waktu dibagi menjadi komponen jam menit dan detik, kemudian dikurangi menjadi detik dengan menggunakan nilai akumulasi dari unit yang lebih tinggi dikalikan dengan 60 saat melewati setiap unit.

Yang +timedigunakan untuk melemparkan waktu untuk nomor.

Itu pada dasarnya akhirnya melakukan: (60 * ((60 * HHHH) + MM)) + SS

Jika hanya beberapa detik yang berlalu maka hasilnya akan menjadi string, jadi untuk memperbaikinya kita bisa mentransmisikan seluruh hasil ke int:

+('03'.split(':').reduce((acc,time) => (60 * acc) + +time));
Paul
sumber
itu sebenarnya sangat pintar .. pertanyaannya adalah seberapa cepat ini dibandingkan dengan perhitungan
ThatBrianDude
4
Ya, itu pintar, tetapi contoh yang baik tentang membuat kode yang sulit dipertahankan tanpa keuntungan praktis. Ini menyimpan 4 karakter ketika diperkecil vs versi yang diperkecil dari jawaban yang diterima. Mengingat bahwa banyak halaman web sekarang melebihi 1MB, penghematan itu agak kurang berarti.
RobG
5
Meskipun jawaban ini tidak seperti dipahami, itu anggun menangani keduanya HH:MM:SSserta MM:SS, sementara jawaban yang diterima tidak.
ckeeney
1
Yang ini memiliki bug jenis konversi, jika hanya bagian detik yang diberikan. Anda perlu secara eksplisit menginisialisasi memo dengan 0 untuk mencegahnya. Pekerjaan: '03'.split(':').reduce((acc,time) => (60 * acc) + +time, 0);Gagal karena mengembalikan string yang tidak diharapkan:'03'.split(':').reduce((acc,time) => (60 * acc) + +time);
Felix Gertz
@FelixGertz Yah terlihat, saya akan mengedit dalam perbaikan untuk kasus itu.
Paul
13

Karena fungsi getTime dari objek Date mendapatkan milidetik sejak 1970/01/01, kita bisa melakukan ini:

var time = '12:23:00';
var seconds = new Date('1970-01-01T' + time + 'Z').getTime() / 1000;
boskop
sumber
1
Baru sadar, ini tidak berfungsi dengan waktu musim panas. Perlu menggunakan tanggal sebenarnya
Yablargo
1
@Yablargo Terima kasih. Versi sebelumnya tidak bekerja dengan baik dengan zona waktu lokal, jadi saya mengeditnya untuk menggunakan format datetime iso 8601 utc.
boskop
13

Ubah hh:mm:ssstring menjadi detik dalam satu baris. Juga diperbolehkan h:m:sformat dan mm:ss, m:sdll

'08:45:20'.split(':').reverse().reduce((prev, curr, i) => prev + curr*Math.pow(60, i), 0)
Paul Hide
sumber
4
Tolong jelaskan jawaban Anda
B001 ᛦ
Ubah hh:mm:ssstring menjadi detik dalam satu baris. Juga diperbolehkan h:m:sformat dan mm:ss, m:sdll.
Paul Hide
Jawaban bagus! Tapi Anda bisa melewati reverse(): '00: 01: 11'.split (':'). Reduce ((val, entry, i) => val + entry * (3600 / Math.pow (60, i)), 0 ) === 71
CMR
@CMR, pendekatan yang menarik, tetapi dalam kasus mm:ssitu tidak akan bekerja dengan benar.
Paul Hide
Math.pow sangat lambat dan dapat dihindari seperti yang ditunjukkan dalam jawaban lain berdasarkan pengurangan
Alejadro Xalabarder
9

mencoba

time="12:12:12";
tt=time.split(":");
sec=tt[0]*3600+tt[1]*60+tt[2]*1;
Luca
sumber
5
ah, itu * 1 adalah cara cerdas untuk membuatnya tidak melakukan penggabungan string :)
Dagg Nabbit
5

Metode statis Javascript berhasil 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;
}
Chronozoa
sumber
4

Ini mungkin bentuk yang sedikit lebih mudah dibaca dari jawaban asli yang disetujui.

const getSeconds = (hms: string) : number => {
  const [hours, minutes, seconds] = hms.split(':');
  return (+hours) * 60 * 60 + (+minutes) * 60 + (+seconds);
};
Jan Vorcak
sumber
2
new Date(moment('23:04:33', "HH:mm")).getTime()

Output: 1499755980000 (dalam milidetik) (1499755980000/1000) (dalam detik)

Catatan: keluaran ini menghitung perbedaan dari 1970-01-01 12: 0: 0 hingga sekarang dan kita perlu mengimplementasikan moment.js

ITsDEv
sumber
OP meminta detik, bukan milidetik
pengguna7294900
Hai pengguna7294900, Terima kasih atas komentar Anda, saya akan memperbarui jawaban saya, jst kita perlu membagi dengan 1000
ITsDEv
1

Fungsi ini berfungsi untuk MM: SS juga:

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])
        }
      }

Philip Tran
sumber
1

Diambil dari solusi yang diberikan oleh Paul https://stackoverflow.com/a/45292588/1191101 tetapi menggunakan notasi fungsi lama sehingga bisa juga digunakan di mesin js lain (misal java Rhino)

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

atau hanya yang ini lebih mudah dibaca

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);
}
Alejadro Xalabarder
sumber
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>

Phillip Senn
sumber
0

Anda dapat melakukan ini secara dinamis - jika Anda tidak hanya menemukan: HH: mm: ss, tetapi juga, mm: ss, atau bahkan ss saja.

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);
Jeffz
sumber
0

Ini adalah solusi yang paling jelas dan mudah dimengerti:

function convertDurationtoSeconds(duration){
    const [hours, minutes, seconds] = duration.split(':');
    return Number(hours) * 60 * 60 + Number(minutes) * 60 + Number(seconds);
};

const input = '01:30:45';
const output = convertDurationtoSeconds(input);
console.log(`${input} is ${output} in seconds`);

Melchia
sumber