Bagaimana cara menggunakan format () pada durasi moment.js?


211

Apakah ada cara saya bisa menggunakan metode moment.js format pada objek durasi? Saya tidak dapat menemukannya di mana pun di dokumen dan tidak terlihat sebagai atribut pada objek durasi.

Saya ingin dapat melakukan sesuatu seperti:

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

Juga, jika ada perpustakaan lain yang dapat dengan mudah mengakomodasi fungsi semacam ini, saya akan tertarik pada rekomendasi.

Terima kasih!


5
moment.utc (durasi.asMilliseconds ()). format ('hh: mm: ss'); - Durasi adalah vektor. Dengan menempatkan ekornya pada titik asal, Anda dapat menggunakan format tanggal untuk mendapatkan jj: mm: dd.
Paul Williams

moment.utc (moment.duration (23, 'detik'). asMilliseconds ()). format ('hh: mm: ss') => "12:00:23" tidak berfungsi dengan baik
goldenratio

Ah, saya menemukan masalah, HH:mm:ssakan memberikan 00:00:23contoh saya sebelumnya. jadi hanya casing yang salah pada bagian Jam
goldenratio

Jawaban:


55

Kami ingin menambahkan semacam pemformatan ke durasi di moment.js. Lihat https://github.com/timrwood/moment/issues/463

Beberapa perpustakaan lain yang mungkin membantu adalah http://countdownjs.org/ dan https://github.com/icambron/twix.js


4
Saya juga menantikan untuk memformat durasi. Mengambil countdownjs sekarang, tetapi twix hanya tampaknya melakukan format "pintar", tidak banyak penyesuaian.
mpen

2
Sementara twix bekerja keras untuk melakukan pemformatan yang cerdas, ia memiliki banyak opsi pemformatan, hingga token yang terlibat: github.com/icambron/twix.js/wiki/Formatting . Penafian: Saya penulis twix.

3
Countdown.js luar biasa, dan penulisnya sangat membantu (dia baru saja merilis 2 versi di hari yang sama karena beberapa saran yang saya buat)!
Ohad Schneider

5
Saya tidak memilih karena masalah github yang ditautkan dalam jawaban ini hanyalah sebuah aliran yang tidak pernah berakhir, opini, keinginan, dan kata-kata kasar yang tidak mengarah ke mana, masalah ini masih terbuka setelah 4 tahun, tidak ada yang bermanfaat
bmaggi

29
Mengapa tidak bisa identik dengan .format lain yang digunakan di tempat lain di perpustakaan? Ini kegilaan. 5 tahun dan itu masih belum selesai? Betulkah?!
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);

Lihatlah JSFiddle


3
Pendekatan yang bagus. Meskipun tidak berfungsi jika saya ingin menampilkan hari juga: DDD HH:mm:ss.SSS(di mana DDDhari tahun) muncul 1ketika saya ingin 0. Adakah perbaikan cepat untuk itu?
Andrew Mao

1
Tidak mudah. Saya melakukan ini jsfiddle.net/fhdd8/14 , yang mungkin apa yang Anda lakukan, tapi saya tidak berpikir saat ada sesuatu yang melakukan ini di luar kotak
David Glass

49
Tidak masuk akal untuk menampilkan 10 kuadriliun milidetik sebagai mm: dd
Pier-Luc Gendreau

28
ini tidak berfungsi selama 24 jam (yaitu jika saya ingin menampilkan 117 jam). jika tidak solusi hebat!
Phil

1
@Phil Anda dapat menggunakan "D" atau "DD" jika Anda ingin menampilkan hari.
Vinay

71

konversi durasi ke ms dan kemudian ke momen:

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

14
Jadi ini tidak berfungsi jika durasi Anda lebih lama dari 24 jam .. 24 jam diatur ulang ke 0j
S. Robijns

4
@ S.Robijns pengamatan yang bermanfaat tetapi hanya untuk menekankan untuk orang lain - ini adalah perilaku yang diharapkan dari .format('HH:mm:ss'). Lihat dokumen
davnicwil

1
ini jawaban terbaik!
Magico

44

Gunakan plugin ini Format Durasi Momen .

Contoh:

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

1
Pemformatan itu tidak berfungsi dengan baik, sisi durasinya bagus tetapi jika saya tentukan hh:mm:mmdan hanya memiliki 10 detik itu menunjukkan 10bukan 00:00:10(bahkan dengan forcelength on) Jika tidak memformat ... maka harus disebut sesuatu yang lain, format harus terstandarisasi.
Piotr Kula

9
@ppkinkin saya tahu ini sudah lama tetapi jika Anda menentukan { trim: false }itu akan menghentikan perilaku itu.
Carlos Martinez

3
Inilah yang saya lebih suka gunakan: Asumsikan Anda memiliki durasi, seperti const duration = moment.duration(value, 'seconds');daripada saya dapat diformat menggunakan: moment.utc(duration.as('milliseconds')).format('HH:mm:ss').toString();
Evgeny Bobkin

1
@EvgenyBobkin yang tidak akan berfungsi jika durasi Anda lebih lama dari satu hari, perpustakaan akan menanganinya
reggaeguitar

16

Gunakan baris kode ini:

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

8
Jika durasinya> dari 86400 '' (yaitu 24 jam), ini tidak akan berfungsi.
Lorenzo Tassone

Itu sama di excel, itu akan berguling pada 24 jam. Ini adalah solusi yang bagus jika Anda mengetahui batasan 24 jam.
Eman4real

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

1
Secara umum, jawaban akan jauh lebih membantu jika mereka menyertakan penjelasan tentang apa yang dimaksudkan untuk dilakukan oleh kode, dan mengapa itu memecahkan masalah tanpa memperkenalkan orang lain. (Posting ini ditandai oleh setidaknya satu pengguna, mungkin karena mereka pikir jawaban tanpa penjelasan harus dihapus.)
Nathan Tuggy

1
Tanpa penjelasan atau tidak, inilah yang saya lakukan. Terima kasih :)
dmmd

Penjelasan tidak diperlukan. Doc Moment.js dapat menunjukkan bagaimana solusi ini dicapai.
coffekid

2
Tak berguna. Seperti kebanyakan jawaban lain pada pertanyaan ini, pengembalian sebagian jam dalam durasi bukan total jam. Misalnya mengembalikan 12:00 untuk durasi saat.durasi ({hari: 2, jam: 12})
Neutrino

1
moment.duration (diff) .asMilliseconds () berlebihan. Anda bisa menggunakan diff, sudah dalam milidetik.
kristopolous

12

Skenario terbaik untuk kasus penggunaan khusus saya adalah:

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

Ini meningkatkan jawaban @ Wilson karena tidak mengakses data internal properti pribadi.


Terima kasih @TaeKwonJoe
Kamlesh

11

Anda tidak perlu .format. Gunakan durasi seperti ini:

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

Saya menemukan solusi ini di sini: https://github.com/moment/moment/issues/463

EDIT:

Dan dengan bantalan untuk detik, menit, dan jam:

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
Ini tidak akan termasuk nol terkemuka jika durasinya.seconds () kurang dari 10, meskipun ...
carpiediem

Apa yang akan terjadi jika Anda memiliki detik lebih dari satu jam? Apakah boleh, bahwa Anda memiliki lebih dari 60 detik?
shaedrich

Angka nol utama berfungsi, tetapi duration = moment.duration(7200, 'seconds'); withPadding(duration);akan mengatakan "00:00".
shaedrich

@shaedrich Saya memperbarui jawaban saya lagi untuk memasukkan jam; jika Anda memerlukan berhari-hari, berminggu-minggu, dan juga Anda dapat menambahkannya ke array
ni-ko-o-kin

1
if (duration.asDays() > 0) { return 'at least one day';- Apakah saya membacanya dengan benar?
Stephen Paul

8

Saya menggunakan:

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

Dan saya mendapatkan "09:30" di var str.


Bagus! Ini hanya berfungsi ... bagaimana mungkin Anda membuat ini :)
vanthome

4
Hindari solusi ini, _dataadalah properti internal dan dapat berubah tanpa peringatan.
Druska

1
Sayangnya itu tidak akan berfungsi seperti yang diharapkan: moment(moment.duration(1200000)._data).format('hh:mm:ss')akan mengembalikan 12:20 bukannya 00:20
Anna R

2
@AnnaR hberada di kisaran 1-12, jadi agak bisa diharapkan. Gunakan Hsebaliknya docs - token jam
barbsan

Ini salah, tidak hanya Anda mengabaikan HARI, sehingga 1 hari dan 1 jam akan ditampilkan sebagai 01:00. Selain itu Anda benar-benar mengabaikan Zona Waktu, solusi yang lebih baik, tetapi juga tidak lengkap satu akan moment.utc(...).format("HH:mm");
Gil Epshtain

5

jika diff adalah sesaat

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

Ini tampaknya tidak dapat diandalkan dalam menghadapi zona waktu dan semacamnya. Apakah Anda menggunakan ini dalam produksi?
Keith

pertanyaannya tidak menyebutkan zona waktu.
Kieran

3
Semua orang tinggal di zona waktu. Apakah saat (0) selalu mendaftar pukul 12:00 di setiap zona waktu?
Keith

Saya hanya bertanya apakah kode dalam jawaban Anda berfungsi atau tidak karena saya skeptis. Saya telah menulis banyak kode yang berfungsi dengan tanggal, dalam banyak bahasa pemrograman. Berdasarkan pengalaman saya, tampaknya kode Anda hanya akan bekerja di zona waktu tertentu - tapi saya bertanya karena mungkin ada sesuatu yang saya tidak tahu tentang bagaimana Javascript mewakili tanggal di dekat zaman Unix.
Keith

1
baris kedua akan menciptakan momen dari awal waktu (1970). Ini tidak akan berhasil.
kumarharsh

5

Jika Anda ingin menggunakan pustaka javascript yang berbeda, numeral.js dapat memformat detik sebagai berikut (contohnya untuk 1000 detik):

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

pasti cara untuk pergi. seperti yang diharapkan.
Piotr Kula

4

Saya menggunakan fungsi format klasik dalam kasus ini:

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

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

Ini adalah retasan karena perbedaan waktu diperlakukan sebagai tanggal momen standar, waktu tanggal zaman awal, tetapi itu tidak masalah bagi tujuan kami dan Anda tidak memerlukan plugin apa pun


4

Jika semua jam harus ditampilkan (lebih dari 24) dan jika '0' sebelum jam tidak diperlukan, maka pemformatan dapat dilakukan dengan baris kode pendek:

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

4

Berdasarkan jawaban ni-ko-o-kin :

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

Saya pikir itu tidak mudah dibaca. Masalah apa yang ingin Anda selesaikan di sini? Apa usecase Anda?
ni-ko-o-kin

Saya memperbarui jawaban saya lagi untuk menangani lebih dari satu hari. Ini berfungsi dengan baik untuk use case saya.
ni-ko-o-kin

2
Masalahnya adalah bahwa dalam kebanyakan kasus solusi Anda tidak ideal karena mengandung terlalu banyak angka nol di depan. Siapa yang ingin mengembalikan "00: 00: 00: 01"? Solusi saya "scalable" dan menambahkan sebanyak mungkin nol di depan.
shaedrich

Bekerja dengan sempurna. Output yang sangat sederhana. Jika tidak ada hari, tidak akan ada angka nol untuk hari yang ditampilkan dll.
Hasan Sefa Ozalp

3

Untuk memformat durasi momen ke string

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

jika Anda menggunakan sudut menambahkan ini ke filter Anda:

.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 ': '')
    }
})

contoh penggunaan

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

Memang sangat bagus. Saya mencari 'format cantik' seperti ini. Terima kasih!
riketscience

3

Solusi saya yang tidak melibatkan perpustakaan lain dan ia bekerja dengan diff> 24jam

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

Bagaimana dengan javascript asli?

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

Gunakan format waktu-durasi .

Kerangka Klien (mis: Bereaksi)

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

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

Server (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}`);

Cetakan:

2 hari 14 jam 00 menit 00 detik


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

Anda dapat menggunakan numeral.js untuk memformat durasi Anda:

numeral(your_duration.asSeconds()).format('00:00:00') // result: hh:mm:ss

0

Ini dapat digunakan untuk mendapatkan dua karakter pertama sebagai jam dan dua terakhir sebagai menit. Logika yang sama dapat diterapkan ke detik.

/**
     * 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>


Jika Anda memasukkan kode sebagai snippet, Anda akan dapat menguji metode dan menunjukkan beberapa output ke konsol.
DJDaveMark

Tentu saja! Baru saja diperbarui dengan cuplikan untuk tes cepat.
José Luis Raffalli

0

moment.duration(x).format()telah ditinggalkan. Anda dapat menggunakan moment.utc(4366589).format("HH:mm:ss")untuk mendapatkan respons yang diinginkan.

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

Bagaimana cara menggunakan durasi moment.js dengan benar? | Gunakan moment.duration () dalam kode

Pertama, Anda perlu mengimpor momentdan moment-duration-format.

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

Kemudian, gunakan fungsi durasi. Mari kita terapkan contoh di atas: 28800 = 8 pagi.

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

🎉Nah, Anda tidak memiliki kesalahan tipe di atas. 🤔Apakah Anda mendapatkan nilai yang tepat 8:00 pagi? Tidak…, nilai yang Anda dapatkan adalah 8:00 a. Format Moment.js tidak berfungsi sebagaimana mestinya.

Solution Solusinya adalah mengubah detik menjadi milidetik dan menggunakan waktu UTC.

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

Baiklah kita dapatkan jam 8:00 pagi sekarang. Jika Anda ingin 8:00 bukan 8:00 untuk waktu yang tidak terpisahkan, kita perlu melakukan RegExp

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

0

Saya perlu melakukan ini untuk bekerja sebagai persyaratan untuk menampilkan jam dalam format ini. Awalnya saya mencoba ini.

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

Namun apa pun lebih dari 24 jam dan jam diatur ulang ke 0. Tetapi menit dan detik akurat. Jadi saya hanya menggunakan bagian itu untuk menit dan detik.

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

Sekarang yang saya butuhkan adalah total jam.

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

Dan untuk mendapatkan format yang kita semua inginkan, kita rekatkan saja.

var formatted = hours + ":" + minutesSeconds

jika totalMillisecondsini 894600000ini akan kembali249:30:00 .

Harapan itu membantu. Tinggalkan pertanyaan di komentar. ;)


-1

Jika Anda menggunakan Angular> 2, saya membuat Pipa yang terinspirasi oleh jawaban @ hai-alaluf.

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

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.