Moment.js'de saniyeleri HH: mm: ss'ye dönüştürme


94

Saniyeleri nasıl dönüştürebilirim HH:mm:ss?

Şu anda aşağıdaki işlevi kullanıyorum

render: function (data){
     return new Date(data*1000).toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1");;
}

Bu chrome üzerinde çalışıyor ancak 12 saniye firefox'ta 01:00:12 tarayıcılar arası uyumluluk için moment.js kullanmak istiyorum.

Bunu denedim ama çalışmıyor

render: function (data){
         return moment(data).format('HH:mm:ss');
}

Neyi yanlış yapıyorum?

DÜZENLE

Bir çözüm bulmayı başardılar olmadan aşağıdaki gibidir moment.js

return (new Date(data * 1000)).toUTCString().match(/(\d\d:\d\d:\d\d)/)[0];

Hala moment.js'de bunu nasıl yapabileceğimi merak ediyorum



@mplungjan Bu yazıyı zaten okuduğumdan bahsetmediğim için özür dilerim. Milyonlarca satırlık bir tablo oluşturmam gerekiyor ve oradaki çözüm çok yavaş. ikinci cevap tam olarak
sorumda yazdıklarım

2
@QuentinTanioartino yani 4 önemsiz matematik operatörü DOM'u milyonlarca element için değiştirme görevi için bir problem mi? Performans problemini doğru anladığınızdan emin misiniz?
zerkms

@zerkms, DAO sınıflarımın zaten dönüştürülmüş verilere hizmet etmek için yeniden yazılması gerektiğini biliyorum. Bu, farkında olduğum bir sorun. İlk denememin şu anki performanslarından oldukça memnun olduğumu ancak sistemi biraz yavaşlatan bir dönüşüm için 5 matematik işlemim olduğunda. Evet, bunun sadece hızlı bir GEÇİCİ çözüm olduğu konusunda size katılıyorum
QGA

Sistemi biraz "---" biraz "yavaşlatan @QuentinTanioartino", performansla ilgili mantık yürütme şekliniz değil. Öyle mi bir darboğaz? Bir darboğaz olduğu kanıtlandı mı ? Değilse - sizi bu işlemi optimize etmeye iten nedir?
zerkms

Yanıtlar:


81

Nereden bu yazı ben sıçrama sorunları önlemek için bu denemek istiyorum

moment("2015-01-01").startOf('day')
    .seconds(s)
    .format('H:mm:ss');

JsPerf'i çalıştırmadım, ancak bunun milyon kez yeni tarih nesneleri oluşturmaktan daha hızlı olduğunu düşünürdüm

function pad(num) {
    return ("0"+num).slice(-2);
}
function hhmmss(secs) {
  var minutes = Math.floor(secs / 60);
  secs = secs%60;
  var hours = Math.floor(minutes/60)
  minutes = minutes%60;
  return `${pad(hours)}:${pad(minutes)}:${pad(secs)}`;
  // return pad(hours)+":"+pad(minutes)+":"+pad(secs); for old browsers
}


2
Çok teşekkürler, çok akıllıca bir çözüm
QGA

1
İkincisi, son derece hızlı
QGA

1
Bunu ikinci örnekte yapabilirsiniz: return [saat, dakika, saniye] .filter (t => t) .map (pad) .join (":")
Onno Faber

@OnnoFaber Sizce en hızlı olan nedir? bitiştirme mi yoksa filtre artı bir harita mı? Ayrıca yapabiliriz`${pad(hours)}:${pad(minutes)}:${pad(secs)}`
mplungjan

Önceki tüm cevaplardan en basit olanı mplungjan'dır , ancak değerin milisaniye olması durumunda rastgele sayıları gösteren bir hatası vardır (örneğin: 17,3 s). Koduna dayanarak şunu öneriyorum: function pad (num) {return ("0" + num) .slice (-2); } / ** * @return {string} * / export varsayılan işlevi renderUserTime (saniye) {let dakika = Math.floor (saniye / 60); const outputSecs = Math.round (saniye% 60); let saat = Math.floor (dakika / 60); const outputMinutes = Math.round (dakika% 60); $ {pad (hours)} dönüş: $ {pad (outputMi
Alberto Soto

98

Bu, mplungjan'ın başka bir gönderiden atıfta bulunduğu yanıta benzer, ancak daha özlüdür:

const secs = 456;

const formatted = moment.utc(secs*1000).format('HH:mm:ss');

document.write(formatted);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

Aynı uyarılardan muzdariptir, örneğin saniyeler bir günü (86400) aşarsa, beklediğinizi alamazsınız.


1
teşekkür ederim, bunun çok yaygın bir ihtiyaç olduğunu düşünüyorum, moment.js'ye bir çekme isteği açın, bunu dahil etmeleri gerekir.
Morris S

Teşekkürler @Sophie. Çok az yerde utc () 'den bahsediyor, bu benim durumumda tam olarak gerekli olan şeydi.
pmont

25

Sen kullanabilirsiniz anı süreli formatlı eklentisi:

var seconds = 3820;
var duration = moment.duration(seconds, 'seconds');
var formatted = duration.format("hh:mm:ss");
console.log(formatted); // 01:03:40
<!-- Moment.js library -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

<!-- moment-duration-format plugin -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-duration-format/1.3.0/moment-duration-format.min.js"></script>

Ayrıca bu Fiddle'a bakın

Güncelleme: 60 saniyeden daha az olan değerler için kırpmayı önlemek için { trim: false }:

var formatted = duration.format("hh:mm:ss", { trim: false }); // "00:00:05"

Cevabınız ve @ sophie'nin cevabıyla birlikte bakılması gereken bir değiş tokuş var. Teknik olarak çözümünüz ss: dd: ss şeklinde bir "Zaman" süresi gösterecek olsa da, ekstra eklenti gerektirir. Sophie's, ss: dd: ss olarak biçimlendirilmiş zaman içinde geçerli noktadan bir "Tarih" dir. Eğer "utc" yi Sophie'den kaldırırsanız, zamanı geçerli nokta olarak değil, tarih olarak kullandığından yanlış bilgi döndürebilir. Her iki cevap da işe yarıyor. Sadece düşünmek ve anlamak için bir şey.
Michael

Burada CDN'yi kullanmak ve daha fazla gecikme ekleyememekle birlikte, "başka bir kitaplığı dahil etme" yi, kodu kendiniz uygulamaya karşı negatif bir ödünleşme olarak düşünmek genellikle tehlikelidir. Bu, birçok geliştiricinin içine düştüğü ve nihayetinde daha az korunabilir kodla sonuçlandığını gördüğüm bir tuzak.
cytinus

Bazı nedenlerden dolayı saniye <60 ise biçimlendirilmemiş olarak biter
Daniel Lizik

@DanielLizik, {trim: false} eklemeniz yeterli. Örneğin: duration.format ("hh: mm: ss", {trim: false});
Oleksiy Kachynskyy

16
var seconds = 2000 ; // or "2000"
seconds = parseInt(seconds) //because moment js dont know to handle number in string format
var format =  Math.floor(moment.duration(seconds,'seconds').asHours()) + ':' + moment.duration(seconds,'seconds').minutes() + ':' + moment.duration(seconds,'seconds').seconds();

1

Moment.js süreleri nasıl doğru kullanılır? | Kodlarda moment.duration () kullanın

Öncelikle, ithalat gerekir momentve moment-duration-format.

import moment from 'moment';
import 'moment-duration-format';

Ardından süre işlevini kullanın. Yukarıdaki örneği uygulayalım: 28800 = 08:00.

moment.duration(28800, "seconds").format("h:mm a");

🎉Yukarıdaki tip hatanız yok. 🤔 08:00 am doğru değeri alıyor musunuz? Hayır…, aldığınız değer 8:00 a. Moment.js formatı olması gerektiği gibi çalışmıyor.

Çözüm, saniyeleri milisaniyeye dönüştürmek ve UTC zamanını kullanmaktır.

moment.utc(moment.duration(value, 'seconds').asMilliseconds()).format('h:mm a')

Pekala, şimdi sabah 8:00 alıyoruz. İntegral saati için 08:00 yerine 08:00 istiyorsanız, RegExp yapmamız gerekir

const time = moment.utc(moment.duration(value, 'seconds').asMilliseconds()).format('h:mm a');
time.replace(/:00/g, '')

1

24 saate kadar Kullanımdan Duration.formatkaldırıldığı gibi moment@2.23.0 ile

const seconds = 123;
moment.utc(moment.duration(seconds,'seconds').as('milliseconds')).format('HH:mm:ss');

1

Saniyeleri (sayı) dize biçimine değiştirmek için çözümüm (örneğin: 'mm: ss'):

const formattedSeconds = moment().startOf('day').seconds(S).format('mm:ss');

Yazın senin yerine Saniye 'S' örnekteki. Ve ihtiyacınız olan yerde 'formattedSeconds' kullanın.

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.