如何在moment.js持续时间上使用format() ?

是否有任何方法可以在持续时间对象上使用moment.js format方法?我在文档中找不到它,也没有看到它是持续时间对象的属性。

我希望能够做到以下几点:

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

此外,如果有其他库可以轻松地容纳这种功能,我会很有兴趣推荐。

谢谢!

335856 次浏览

如果diff是一瞬间

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

我们正在考虑在moment.js中为持续时间添加某种格式。看到https://github.com/timrwood/moment/issues/463

http://countdownjs.org/https://github.com/icambron/twix.js这两个库可能会有所帮助

// 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.asMilliseconds()).format("HH:mm:ss.SSS");
alert(f);

看看JSFiddle

使用这个插件时刻时长格式

例子:

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

如果你愿意使用不同的javascript库,numeral.js可以按照以下方式格式化秒(例如1000秒):

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

在这些情况下,我使用经典的format函数:

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


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

这是一个hack,因为时间差异被视为一个标准的时刻日期,一个早期的epoch日期时间,但这对我们的目标并不重要,你不需要任何插件

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

我使用:

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

我在var str中得到"09:30"

将时刻持续时间格式化为字符串

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

如果你使用angular,添加这个到你的过滤器:

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

使用的例子

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

将持续时间转换为ms,然后转换为moment:

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

原生javascript怎么样?

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

你不需要.format。像这样使用持续时间:

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

我在这里找到了这个解决方案:https://github.com/moment/moment/issues/463

编辑:

用秒、分和小时填充:

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

如果必须显示所有的小时(超过24小时),如果小时之前的'0'是不必要的,那么格式化可以用一小行代码完成:

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

我的特定用例的最佳场景是:

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

这改进了@Wilson的回答,因为它不访问私有内部属性_data。

如果你使用Angular >2,我做了一个受@hai-alaluf answer启发的Pipe。

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

基于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
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}`);

打印:

2天14小时00分00秒

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

使用这行代码:

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

这对我来说很管用:

moment({minutes: 150}).format('HH:mm') // 01:30

我的解决方案不涉及任何其他库,它与diff > 24小时工作

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

你可以使用numeral.js来格式化你的持续时间:

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

使用moment-duration-format

客户端框架(例如:React)

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


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

服务器(node . js)

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


momentDurationFormatSetup(moment);


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

这可以用于将前两个字符作为小时,最后两个字符作为分钟。同样的逻辑也适用于秒。

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

moment.duration(x).format()已弃用。 您可以使用__abc0来获得所需的响应

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>

如何正确使用moment.js持续时间? | 在代码中使用moment.duration()

首先你需要导入momentmoment-duration-format

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

然后,使用持续时间函数。让我们应用上面的例子:28800 =上午8点。

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

🎉好吧,你没有上面的类型错误。🤔你得到一个正确的值8:00 am ?不,你得到的值是8:00 a. Moment.js格式没有正常工作。

💡解决方案是将秒转换为毫秒并使用UTC时间。

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

好了,现在是早上8点。如果您希望在积分时间上是上午8点而不是上午8点,则需要执行RegExp

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

我需要为工作这样做,因为需要以这种格式显示小时数。 一开始我尝试了这个。

moment.utc(totalMilliseconds).format("HH:mm:ss")
但是任何超过24小时并且小时重置为0的事情。 但是分和秒是准确的。 所以我只用这部分来表示分和秒
var minutesSeconds = moment.utc(totalMilliseconds).format("mm:ss")

现在我只需要总时间。

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

为了得到我们都想要的格式,我们只需要把它们粘在一起。

var formatted = hours + ":" + minutesSeconds

如果totalMilliseconds894600000,则返回249:30:00

希望这有帮助。请在评论中留下任何问题。;)

不再需要(如果曾经有过的话)将持续时间转换为utc来解决这个问题。这就像将base10 "1"到二进制,然后说既然输出"1"看起来像base10,我们不会有任何问题,假设这是一个base10值,用于任何进一步的操作。

使用moment-duration-format并注意使用{ trim: false }可以防止修剪:

moment.duration(1000000, "seconds").format("hh:mm:ss", { trim: false })
> "277:46:40"
moment.duration(0, "seconds").format("hh:mm:ss", { trim: false })
> "00:00:00"

让我们将其与不推荐的滥用utc的使用方法进行比较:

moment.utc(moment.duration(1000000, "seconds").asMilliseconds()).format('HH:mm:ss')
> "13:46:40"

简短版本(一行程序):

moment.duration(durationInMs).asHours()|0||"00" + ":" + moment.utc(durationInMs).format("mm:ss")

扩展的版本:

export const formatDuration = (durationInMs) => {
const hours = Math.floor(moment.duration(durationInMs).asHours()) || "00"
return hours + ":" + moment.utc(durationInMs).format("mm:ss")
}

示例案例:

Example cases .

只需moment.js,不需要任何其他插件

moment().startOf('day').seconds(duration).format('HH:mm:ss')