Moment.js süresinde format () nasıl kullanılır?


211

Moment.js format yöntemini süre nesneleri üzerinde kullanabilmemin bir yolu var mı ? Belgelerde hiçbir yerde bulamıyorum ve süre nesnelerinde bir özellik olarak görülmüyor.

Şöyle bir şey yapabilmek istiyorum:

var diff = moment(end).unix() - moment(start).unix();
moment.duration(diff).format('hh:mm:ss')

Ayrıca, kolayca bu tür işlevsellik uyum sağlayabilecek başka kütüphaneler varsa, ben tavsiye ile ilgileniyorum.

Teşekkürler!


5
moment.utc (duration.asMilliseconds ()) biçiminde ( 'ss: dd: ss.'); - Süre bir vektördür. Kuyruğunu başlangıç ​​noktasına yerleştirerek ss: dd: ss elde etmek için tarih biçimlendirmesini kullanabilirsiniz.
Paul Williams

moment.utc (moment.duration (23, 'seconds'). asMilliseconds ()). format ('ss: dd: ss') => "12:00:23" çok iyi çalışmıyor
goldenratio

Ah, sorunu buldum, önceki örneğimde HH:mm:ssvereceğim 00:00:23.
Yani

Yanıtlar:


55

Moment.js'de sürelere bir tür biçimlendirme eklemek istiyoruz. Bkz. Https://github.com/timrwood/moment/issues/463

Yardımcı olabilecek diğer birkaç kütüphane http://countdownjs.org/ ve https://github.com/icambron/twix.js


4
Ben de süre biçimlendirme için sabırsızlanıyorum. Şimdi bir geri sayım bakmak, ama twix sadece "akıllı" biçimlendirme yapmak gibi görünüyor, çok özelleştirme değil.
mpen

2
Twix akıllı biçimlendirme yapmak için çok çalışıyor olsa da, dahil olan belirteçlere kadar birçok biçimlendirme seçeneği var: github.com/icambron/twix.js/wiki/Formatting . Feragatname: Ben twix'in yazarıyım.

3
Countdown.js mükemmel ve yazar süper yardımcı ( yaptığım bazı öneriler nedeniyle aynı gün içinde sadece 2 sürüm yayınladı )!
Ohad Schneider

5
Bu cevaba bağlanan github sorunu sadece hiç bitmeyen bir akış görüşleri, dilekleri ve sıraları, hiçbir yere yol açmıyor, çünkü sorun 4 yıl sonra hala açık, kullanışlı bir şey yok
bmaggi

29
Neden kütüphanede başka bir yerde kullanılan diğer .format ile aynı olamaz? Bu delilik. 5 yıl ve hala yapılmadı mı? Gerçekten mi?!
kristopolous

164
// set up
let start = moment("2018-05-16 12:00:00"); // some random moment in time (in ms)
let end = moment("2018-05-16 12:22:00"); // some random moment after start (in ms)
let diff = end.diff(start);

// execution
let f = moment.utc(diff).format("HH:mm:ss.SSS");
alert(f);

JSFiddle'a bir göz atın


3
Iyi bir yaklaşım. Günleri de görüntülemek istersem çalışmıyor olsa da: DDD HH:mm:ss.SSS( DDDyılın günü nerede ) 1istediğim zaman görüntülenir 0. Bunun için hızlı bir düzeltme var mı?
Andrew Mao

1
Kolay yolu yok. Bunu jsfiddle.net/fhdd8/14 yaptım , ki bu muhtemelen sizin yaptığınız şeydir, ancak anın kutunun dışında bunu yapan bir şey olduğunu sanmıyorum
David Glass

49
10 katrilyon milisaniyeyi mm olarak göstermek hiç mantıklı değil: ss
Pier-Luc Gendreau

28
bu 24 saat geçmez (yani 117 saat görüntülemek istersem). aksi takdirde harika bir çözüm!
Phil

1
@Günlük göstermek istiyorsanız "D" veya "DD" kullanabilirsiniz.
Vinay

71

süreyi ms'ye ve sonra şu ana dönüştür:

moment.utc(duration.as('milliseconds')).format('HH:mm:ss')

14
Bu, süreniz 24 saatten uzunsa işe yaramaz. 24 saat 0
saate

4
@ S.Robijns yararlı bir gözlem ama sadece başkaları için vurgulamak - bu olduğunu beklenen davranış .format('HH:mm:ss'). Belgeleri görün
davnicwil

1
bu en iyi cevap!
Magico

44

Bu eklenti Moment Duration Formatını kullanın .

Misal:

moment.duration(123, "minutes").format("h:mm");

1
Biçimlendirme düzgün çalışmıyor Yani, süresi tarafı iyidir ama belirtirseniz hh:mm:mmve sadece 10 saniye var gösterir 10yerine 00:00:10onun biçimlendirme Değilse ... o zaman başka bir şey çağrılmalıdır, biçimleri olmalıdır (hatta forcelength üzerinde birlikte) standardize.
Piotr Kula

9
@ppumkin bunun eski olduğunu biliyorum ama belirtirseniz { trim: false }bu davranışı durduracaktır.
Carlos Martinez

3
Bu kullanmayı tercih ettiğim şey: Ben const duration = moment.duration(value, 'seconds');kullanarak biçimlendirilmiş olabilir gibi süresi var varsayalım : moment.utc(duration.as('milliseconds')).format('HH:mm:ss').toString();
Evgeny Bobkin

1
Süreniz bir günden daha uzunsa çalışmayan @EvgenyBobkin, kütüphane bunu halledecektir
reggaeguitar

16

Bu kod satırını kullanın:

moment.utc(moment.duration(4500, "seconds").asMilliseconds()).format("HH:mm:ss")

8
Süre 86400 '' (yani 24 saat) ise, bu çalışmaz.
Lorenzo Tassone

Excel'de de aynı, 24 saatte yuvarlanacak. 24 saat sınırlamasının farkındaysanız, bu harika bir çözümdür.
Eman4real

15
var diff = moment(end).unix() - moment(start).unix();
moment.utc(moment.duration(diff).asMilliseconds()).format("HH:mm:ss.SSS");

1
Genellikle, kodun ne yapması gerektiği ve başkalarını tanıtmadan sorunu neden çözdüğüne dair bir açıklama içeriyorsa, cevaplar çok daha yararlıdır. (Bu yazı, muhtemelen açıklama yapmadan bir yanıtın silinmesi gerektiğini düşündükleri için en az bir kullanıcı tarafından işaretlendi.)
Nathan Tuggy

1
Açıklamasız olsun ya da olmasın, bu benim için yaptı. Teşekkürler :)
dmmd

Açıklama gerekli değildir. Moment.js doc, bu çözümün nasıl elde edildiğini gösterebilir.
coffekid

2
Faydasız. Bu sorudaki diğer birçok cevap gibi, toplam saat değil, kısmi saat döndürür. Örneğin, moment momenti için 12:00 değerini döndürür. ({Gün: 2, saat: 12})
Neutrino

1
moment.duration (diff) .asMilliseconds () aşırı. Farkı kullanabilirsiniz, zaten milisaniye cinsindendir.
kristopolous

12

Özel kullanım durumum için en iyi senaryo:

var duration = moment.duration("09:30"),
    formatted = moment.utc(duration.asMilliseconds()).format("HH:mm");

Bu, özel dahili mülk _ verisine erişemediği için @ Wilson'un cevabını geliştirir.


Size @TaeKwonJoe ederiz
Kamlesh

11

.Format'a ihtiyacınız yok. Bunun gibi süreleri kullanın:

const duration = moment.duration(83, 'seconds');
console.log(duration.minutes() + ':' +duration.seconds());
// output: 1:23

Bu çözümü burada buldum: https://github.com/moment/moment/issues/463

DÜZENLE:

Ve saniye, dakika ve saat boyunca dolgu ile:

const withPadding = (duration) => {
    if (duration.asDays() > 0) {
        return 'at least one day';
    } else {
        return [
            ('0' + duration.hours()).slice(-2),
            ('0' + duration.minutes()).slice(-2),
            ('0' + duration.seconds()).slice(-2),
        ].join(':')
    }
}

withPadding(moment.duration(83, 'seconds'))
// 00:01:23

withPadding(moment.duration(6048000, 'seconds'))
// at least one day

2
Bu, duration.seconds () 10'dan
küçükse baştaki

Bir saatten fazla saniyeniz varsa ne olur? 60 saniyeden uzun bir süre geçirmeniz iyi mi?
shaedrich

Önde gelen sıfırlar çalışır, ancak duration = moment.duration(7200, 'seconds'); withPadding(duration);"00:00" diyecek.
shaedrich

@shaedrich Cevabımı saatleri içerecek şekilde tekrar güncelledim; günler, haftalar da gerekiyorsa, bunları diziye ekleyebilirsiniz
ni-ko-o-kin

1
if (duration.asDays() > 0) { return 'at least one day';- Doğru mu okuyorum?
Stephen Paul

8

Kullanırım:

var duration = moment.duration("09:30");
var str = moment(duration._data).format("HH:mm");

Ve ben var str "09:30" olsun.


Harika! Bu sadece çalışır ... bunu nasıl buldun :)
vanthome

4
Bu çözümden kaçının, _datadahili bir özelliktir ve uyarı yapmadan değişebilir.
Druska

1
Ne yazık ki her zaman beklendiği gibi çalışmayacak: moment(moment.duration(1200000)._data).format('hh:mm:ss')00:20 yerine 12:20 dönecek
Anna R

2
@AnnaR h1-12 aralığındadır, bu yüzden oldukça beklenebilir. HBunun yerine dokümanlar
barbsan

Bu yanlıştır, sadece DAYS'ı görmezden gelmekle kalmaz, bu yüzden 1 gün ve 1 saat 01:00 olarak gösterilir. Buna ek olarak, Zaman Dilimlerini tamamen görmezden geliyorsunuz, daha iyi bir çözüm, ama aynı zamanda tam bir çözüm olmayacak moment.utc(...).format("HH:mm");
Gil Epshtain

5

eğer fark bir an ise

var diff = moment(20111031) - moment(20111010);
var formated1 = moment(diff).format("hh:mm:ss");
console.log("format 1: "+formated1);

Bu, zaman dilimleri ve benzerleri karşısında güvenilir görünmüyor. Bunu üretimde kullanıyor musunuz?
Keith

sorunun saat dilimlerinden bahsedilmemesi.
Kieran

3
Herkes bir zaman diliminde yaşıyor. Moment (0) her zaman diliminde her zaman 12:00 olarak kaydediliyor mu?
Keith

Ben sadece cevabınızdaki kodun işe yarayıp yaramadığını soruyorum çünkü şüpheliyim. Birçok programlama dilinde tarihlerle çalışan bir sürü kod yazdım. Deneyimlerime dayanarak, kodunuzun yalnızca belirli saat dilimlerinde çalışacağı anlaşılıyor - ama soruyorum çünkü belki de Javascript'in Unix çağının yakınındaki tarihleri ​​nasıl temsil ettiği hakkında bilmediğim bir şey var.
Keith

1
ikinci satır zamanın başlangıcından itibaren bir an yaratacaktır (1970). Bu olmaz.
kumarharsh

5

Farklı bir javascript kütüphanesi kullanmak istiyorsanız, numeral.js saniyeleri aşağıdaki gibi biçimlendirebilir (örnek 1000 saniyedir):

var string = numeral(1000).format('00:00');
// '00:16:40'

kesinlikle gidilecek yol. beklenildiği gibi.
Piotr Kula

4

Bu durumlarda klasik format işlevini kullanıyorum:

var diff = moment(end).unix() - moment(start).unix();

//use unix function instead of difference
moment.unix(diff).format('hh:mm:ss')

Bu bir hack çünkü zaman farkı standart bir an tarihi, erken bir tarih tarihi olarak kabul edilir, ancak hedefimiz için önemli değildir ve herhangi bir eklentiye ihtiyacınız yoktur


4

Tüm saatlerin görüntülenmesi gerekiyorsa (24'ten fazla) ve saatlerden önce '0' gerekli değilse, biçimlendirme kısa bir kod satırı ile yapılabilir:

Math.floor(duration.as('h')) + moment.utc(duration.as('ms')).format(':mm:ss')

4

Ni-ko-o-kin'nin cevabına dayanarak :

meassurements = ["years", "months", "weeks", "days", "hours", "minutes", "seconds"];
withPadding = (duration) => {
    var step = null;
    return meassurements.map((m) => duration[m]()).filter((n,i,a) => {
        var nonEmpty = Boolean(n);
        if (nonEmpty || step || i >= a.length - 2) {
            step = true;
        }
        return step;
    }).map((n) => ('0' + n).slice(-2)).join(':')
}

duration1 = moment.duration(1, 'seconds');
duration2 = moment.duration(7200, 'seconds');
duration3 = moment.duration(604800, 'seconds');

withPadding(duration1); // 00:01
withPadding(duration2); // 02:00:00
withPadding(duration3); // 01:07:00:00:00

Çok okunabilir olduğunu sanmıyorum. Burada hangi sorunu çözmek istiyorsun? Usecase'iniz nedir?
ni-ko-o-kin

Cevabımı bir günden fazla bir süre için tekrar güncelledim. Kullanım durumum için iyi çalışıyor.
ni-ko-o-kin

2
Sorun, çoğu durumda çözümünüzün ideal olmamasıdır çünkü çok fazla önde gelen sıfır içerir. Kim "00: 00: 00: 00: 01" i iade etmek ister? Benim çözüm "ölçeklenebilir" ve gerektiği kadar önde gelen sıfırlar ekler.
shaedrich

Mükemmel çalışıyor. Çok basit çıktı. Gün yoksa görüntülenen günler için sıfır olmaz.
Hasan Sefa Ozalp

3

Moment süresini dize olarak biçimlendirmek için

var duration = moment.duration(86400000); //value in milliseconds
var hours = duration.hours();
var minutes = duration.minutes();
var seconds = duration.seconds();
var milliseconds = duration.milliseconds();

var date = moment().hours(hours).minutes(minutes).seconds(seconds).millisecond(milliseconds);
if (is12hr){
    return date.format("hh:mm:ss a");
}else{
    return date.format("HH:mm:ss");
}

3

açısal kullanıyorsanız bunu filtrelerinize ekleyin:

.filter('durationFormat', function () {
    return function (value) {
        var days = Math.floor(value/86400000);
        value = value%86400000;
        var hours = Math.floor(value/3600000);
        value = value%3600000;
        var minutes = Math.floor(value/60000);
        value = value%60000;
        var seconds = Math.floor(value/1000);
        return (days? days + ' days ': '') + (hours? hours + ' hours ': '') + (minutes? minutes + ' minutes ': '') + (seconds? seconds + ' seconds ': '')
    }
})

kullanım örneği

<div> {{diff | durationFormat}} </div>

Gerçekten çok iyi. Böyle güzel bir format arıyordum. Teşekkürler!
riketscience

3

Başka bir kütüphane içermeyen ve fark> 24 saat ile çalışan çözümüm

var momentInSeconds = moment.duration(n,'seconds')
console.log(("0" + Math.floor(momentInSeconds.asHours())).slice(-2) + ':' + ("0" + momentInSeconds.minutes()).slice(-2) + ':' + ("0" + momentInSeconds.seconds()).slice(-2))

1

Yerli javascript nasıl?

var formatTime = function(integer) {
    if(integer < 10) {
        return "0" + integer; 
    } else {
        return integer;
    }
}

function getDuration(ms) {
    var s1 = Math.floor(ms/1000);
    var s2 = s1%60;
    var m1 = Math.floor(s1/60);
    var m2 = m1%60;
    var h1 = Math.floor(m1/60);
    var string = formatTime(h1) +":" + formatTime(m2) + ":" + formatTime(s2);
    return string;
}

1

An-süre biçimini kullanın .

İstemci Çerçevesi (ör: React)

import moment from 'moment';
import momentDurationFormatSetup from 'moment-duration-format';
momentDurationFormatSetup(moment);

const breakLengthInMinutes = moment.duration(breakLengthInSeconds, 's').format('m');

Sunucu (node.js)

const moment = require("moment-timezone");
const momentDurationFormatSetup = require("moment-duration-format");

momentDurationFormatSetup(moment);

const breakLengthInMinutes = moment.duration(breakLengthInSeconds, 's').format('m');

0
const duration = moment.duration(62, 'hours');
const n = 24 * 60 * 60 * 1000;
const days = Math.floor(duration / n);
const str = moment.utc(duration % n).format('H [h] mm [min] ss [s]');
console.log(`${days > 0 ? `${days} ${days == 1 ? 'day' : 'days'} ` : ''}${str}`);

Baskılar:

2 gün 14 sa 00 dk 00 sn


0
import * as moment from 'moment'
var sleep = require('sleep-promise');

(async function () {
    var t1 = new Date().getTime();
    await sleep(1000); 
    var t2 = new Date().getTime();
    var dur = moment.duration(t2-t1); 
    console.log(`${dur.hours()}h:${dur.minutes()}m:${dur.seconds()}s`);
})();
0h:0m:1s


0

Bu, ilk iki karakteri saat, son iki karakteri dakika olarak almak için kullanılabilir. Saniyeye aynı mantık uygulanabilir.

/**
     * PT1H30M -> 0130
     * @param {ISO String} isoString
     * @return {string} absolute 4 digit number HH:mm
     */

    const parseIsoToAbsolute = (isoString) => {
    
      const durations = moment.duration(isoString).as('seconds');
      const momentInSeconds = moment.duration(durations, 'seconds');
    
      let hours = momentInSeconds.asHours().toString().length < 2
        ? momentInSeconds.asHours().toString().padStart(2, '0') : momentInSeconds.asHours().toString();
        
      if (!Number.isInteger(Number(hours))) hours = '0'+ Math.floor(hours);
    
      const minutes = momentInSeconds.minutes().toString().length < 2
        ? momentInSeconds.minutes().toString().padEnd(2, '0') : momentInSeconds.minutes().toString();
    
      const absolute = hours + minutes;
      return absolute;
    };
    
    console.log(parseIsoToAbsolute('PT1H30M'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment-with-locales.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>


Kodu snippet olarak eklerseniz, yöntemi test edebilir ve konsola bazı çıktılar gösterebilirsiniz.
DJDaveMark

Tabi ki! Hızlı testler için snippet ile güncellendi.
José Luis Raffalli

0

moment.duration(x).format(), kullanımdan kaldırıldı. moment.utc(4366589).format("HH:mm:ss")İstediğiniz yanıtı almak için kullanabilirsiniz .

console.log(moment.utc(4366589).format("HH:mm:ss"))
<script src="https://momentjs.com/downloads/moment.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


0

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

Önce 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");

🎉Evet, yukarıdaki tipte bir hatanız yok. 8 8: 00'da doğru bir değer elde ediyor musunuz? Hayır…, aldığınız değer 8:00 a. Moment.js biçimi olması gerektiği gibi çalışmıyor.

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

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

Pekala, şimdi saat 8:00. İntegral süre için 08:00 yerine 08:00 istiyorsanız, RegExp yapmamız gerekiyor

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

0

Saatleri bu biçimde görüntülemek için bir gereklilik olarak çalışmak için bunu yapmam gerekiyordu. İlk başta bunu denedim.

moment.utc(totalMilliseconds).format("HH:mm:ss")

Ancak 24 saatten fazla ve saat 0'a sıfırlanır. Ancak dakikalar ve saniyeler doğruydu. Bu yüzden sadece o kısmı dakikalar ve saniyeler boyunca kullandım.

var minutesSeconds = moment.utc(totalMilliseconds).format("mm:ss")

Şimdi tek ihtiyacım olan toplam saat.

var hours = moment.duration(totalMilliseconds).asHours().toFixed()

Ve hepimizin istediği formatı elde etmek için sadece yapıştırıyoruz.

var formatted = hours + ":" + minutesSeconds

eğer totalMillisecondsolduğunu 894600000bu dönecektir249:30:00 .

Umut etmek bu yardım etmek. Sorularınıza yorum bırakın. ;)


-1

Açısal> 2 kullanıyorsanız, @ hai-alaluf cevabından esinlenerek bir Boru yaptım.

import {Pipe, PipeTransform} from "@angular/core";

@Pipe({
  name: "duration",
})

export class DurationPipe implements PipeTransform {

  public transform(value: any, args?: any): any {

    // secs to ms
    value = value * 1000;
    const days = Math.floor(value / 86400000);
    value = value % 86400000;
    const hours = Math.floor(value / 3600000);
    value = value % 3600000;
    const minutes = Math.floor(value / 60000);
    value = value % 60000;
    const seconds = Math.floor(value / 1000);
    return (days ? days + " days " : "") +
      (hours ? hours + " hours " : "") +
      (minutes ? minutes + " minutes " : "") +
      (seconds ? seconds + " seconds " : "") +
      (!days && !hours && !minutes && !seconds ? 0 : "");
  }
}

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.