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.


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);

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;
}

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));

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;

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)

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;

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;
}

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

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


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


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

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

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);

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`);

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.