HH: MM: SS dizesini yalnızca javascript'te saniyeye dönüştür


100

Şuna benzer bir gereksinimim var: Saati HH: MM: SS biçiminde yalnızca saniyeye dönüştür?

ancak javascript'te. Saniyeleri farklı biçimlere dönüştürmenin birçok örneğini gördüm, ancak HH: MM: SS'yi saniyeye dönüştürmedim. Herhangi bir yardım memnuniyetle karşılanacaktır.


oops .. yazım hatası için özür dilerim. evet, saat ss: dd: ss
Sri Reddy

Nedir DDiçinde HH:MM:DD?
Brian Driscoll

2
Bu, PHP sorusundaki ile aynı algoritma.
scottheckel

Peki .. H (Saat) == 3600 saniye, M (dakika) == 60 saniye ... yani ..
MilkyWayJoe

1
Düşündüğüm tek çözüm, dizeyi dizide bölmek ve ardından 3600 ile saat çarpmak ve 60'ı min ile çarpmak ve hepsini saniye kısmı ile toplamak. Bu en basit çözüm mü?
Sri Reddy

Yanıtlar:


195

Bunu dene:

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
İşte bunun prototip versiyonu! String.prototype.toSeconds = function () { if (!this) return null; var hms = this.split(':'); return (+hms[0]) * 60 * 60 + (+hms[1]) * 60 + (+hms[2] || 0); } NOT: || 0Sondaki, bu kodun herhangi bir uygulaması için iyidir - HH: MM'nin (hala geçerli) zaman gösterimi ile ilgili sorunları önler (Chrome türü = "zaman" girişleri, saniye = 0 olduğunda bu biçimde çıktı verir).
Fateh Khalsa

Müthiş şeyler dostum
eddy

ben sadece var hh:mmdeğil secondsben değiştirmek zorunda bu durumda ne ..?
Mr dünya çapında

1
@AbdulWaheed Bu satırı değiştir: var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); olarakvar seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60;
Rova

4
Sayısal dizeyi sayıya dönüştürmek için "+" operatörünün kullanılması iyi bir fikir değildir. Kısa ve "zeki" görünüyor, ancak kafa karıştırıcı ve temiz kod değil. Bunun yerine parseInt (x, 10) kullanın. Ve tek satırlıktan kaçının. Ayrıca tanımsız girdilerden kaynaklanan hataları önleyin. Örneğin: bu bir dize değildir, ":" içermez veya yalnızca "HH: MM" içerir. vb.
Dominik

68

Bu işlev "HH: MM: SS" ile birlikte "MM: SS" veya "SS" yi de işler.

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

Güzel, geçen süre için herhangi bir format olması şartı ortaya çıkarsa saklayacağım. Teşekkürler!
Sri Reddy

Şimdiye kadarki en iyi cevap
Rezwan Azfar Haleem

Bu cevap kullanışlıdır
Mike Aron

Yalnızca 'HH: MM' biçiminde kullanmak için işlevinizde neyi değiştirmem gerekiyor
noyruto88

39

Bu, aşağıdakilerle oldukça esnek bir şekilde yapılabilir:

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

Bunun nedeni, saat, dakika ve saniye içindeki her bir zaman biriminin, küçük birimden 60'ın katı olmasıdır. Zaman, saat dakika ve saniye bileşenlerine bölünür, ardından her bir birimden geçerken daha yüksek birimlerin toplam değeri 60 ile çarpılarak saniyeye indirilir.

+timeBir sayıya zaman döküm için kullanılır.

Temelde şunu yapıyor: (60 * ((60 * HHHH) + MM)) + SS

Sadece saniye geçilirse, sonuç bir dizge olur, bu yüzden tüm sonucu bir int'e çevirebileceğimizi düzeltmek için:

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

bu aslında oldukça zekice .. soru bunun bir hesaplamaya kıyasla ne kadar hızlı olduğu
ThatBrianDude

4
Evet zekice, ancak pratik bir kazanç sağlamadan bakımı zor kod yaratmanın güzel bir örneği. Kabul edilen cevabın küçültülmüş versiyonuna karşı küçültüldüğünde 4 karakter kaydeder. Birçok web sayfasının şu anda 1MB’yi aştığı düşünüldüğünde, bu tasarruf biraz önemsiz olmaktan çok daha az.
RobG

5
Bu cevap o kadar anlaşılır olmasa da, hem hem HH:MM:SSde zarif bir şekilde ele MM:SSalınırken, kabul edilen cevap değil.
ckeeney

1
Sadece saniye bölümü verilmişse, bunda bir tür dönüştürme hatası vardır. Bunu önlemek için notu 0 ile açık bir şekilde başlatmanız gerekir. Çalışıyor: '03'.split(':').reduce((acc,time) => (60 * acc) + +time, 0);Başarısız oluyor çünkü beklenmedik bir dize döndürüyor:'03'.split(':').reduce((acc,time) => (60 * acc) + +time);
Felix Gertz

@FelixGertz İyi tespit edildi, bu durum için bir düzeltmede düzenleyeceğim.
Paul

14

Yana getTime Date nesnesinin işlevi 1970/01/01 beri milisaniye alır, bunu yapabiliriz:

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

1
Bunun yaz saati uygulamasıyla çalışmadığını yeni fark ettim. Gerçek tarihi kullanmanız gerekiyor
Yablargo

1
@Yablargo Teşekkürler. Önceki sürüm yerel saat dilimiyle pek iyi çalışmadı, bu yüzden onu iso 8601 utc tarih saat biçimini kullanacak şekilde düzenledim.
boskop

13

Dizeyi hh:mm:ssbir satırda saniyeye dönüştürün . Ayrıca izin verilen h:m:sbiçim ve mm:ss, m:svb

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

4
Lütfen cevabınızı açıklayın
B001 ᛦ

Dizeyi hh:mm:ssbir satırda saniyeye dönüştürün . Ayrıca izin verilen h:m:sbiçim ve mm:ss, m:svb
Paul Hide

Güzel cevap! Ancak reverse(): '00: 01: 11'.split (':'] 'i atlayabilirsiniz. Azalt ((val, entry, i) => val + entry * (3600 / Math.pow (60, i)), 0 ) === 71
CMR

@CMR, ilginç yaklaşım, ancak bu durumda mm:ssdoğru çalışmayacaktır.
Paul Hide

Math.pow çok yavaştır ve azaltmaya dayalı diğer yanıtlarda gösterildiği gibi önlenebilir
Alejadro Xalabarder

9

Deneyin

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

5
ah, bu * 1, dize birleştirme yapmamayı sağlamanın akıllıca bir yolu :)
Dagg Nabbit

5

Javascript'in statik yöntemi Date.UTC()hile yapar:

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

Orijinal onaylanmış yanıtla ilgili belki biraz daha okunabilir bir form var.

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

Çıkış: 1499755980000 (milisaniye olarak) (1499755980000/1000) (saniye olarak)

Not: Bu çıktının hesaplaması 1970-01-01 12: 0: 0'dan bugüne kadar farklılık gösterir ve moment.js'yi uygulamamız gerekir.


OP milisaniye değil saniye istedi
user7294900

Merhaba user7294900, Yorumunuz için Thx cevabımı güncelleyeceğim, ancak 1000'e
bölmemiz

1

Bu işlev MM: SS için de çalışır:

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 tarafından verilen çözümden alınmıştır, ancak eski işlev gösterimi kullanılarak diğer js motorlarında da kullanılabilir (örneğin java Rhino)

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

ya da sadece bu daha okunabilir

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

Bunu dinamik olarak yapabilirsiniz - yalnızca: HH: mm: ss değil, aynı zamanda mm: ss veya hatta tek başına ss ile karşılaşmanız durumunda.

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

Bu en açık, anlaşılması kolay çözümdür:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.