How do I use format() on a moment.js duration?
有什么办法可以在持续时间对象上使用moment.js
我希望能够执行以下操作:
1 2 | var diff = moment(end).unix() - moment(start).unix(); moment.duration(diff).format('hh:mm:ss') |
另外,如果还有其他任何可以轻松容纳这种功能的库,我会对建议感兴趣。
谢谢!
1 2 3 4 5 6 7 8 | // 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
将持续时间转换为ms,然后转换为矩:
1 | moment.utc(duration.as('milliseconds')).format('HH:mm:ss') |
我们正在考虑为moment.js中的持续时间添加某种格式。参见https://github.com/timrwood/moment/issues/463
http://countdownjs.org/和https://github.com/icambron/twix.js还有一些其他可能会有所帮助的库
使用此插件的Moment Duration Format。
例:
1 | moment.duration(123,"minutes").format("h:mm"); |
1 2 | var diff = moment(end).unix() - moment(start).unix(); moment.utc(moment.duration(diff).asMilliseconds()).format("HH:mm:ss.SSS"); |
使用以下代码行:
1 | moment.utc(moment.duration(4500,"seconds").asMilliseconds()).format("HH:mm:ss") |
对于我的特定用例,最佳方案是:
1 2 | var duration = moment.duration("09:30"), formatted = moment.utc(duration.asMilliseconds()).format("HH:mm"); |
这将改善@Wilson的答案,因为它不访问私有内部属性_data。
您不需要.format。使用这样的持续时间:
1 2 3 | const duration = moment.duration(83, 'seconds'); console.log(duration.minutes() + ':' +duration.seconds()); // output: 1:23 |
我在这里找到了这个解决方案:https://github.com/moment/moment/issues/463
编辑:
并填充了几秒钟,几分钟和几小时:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 |
我用:
1 2 | var duration = moment.duration("09:30"); var str = moment(duration._data).format("HH:mm"); |
我在var str中得到" 09:30"。
如果您愿意使用其他JavaScript库,则numeric.js可以按以下格式设置秒数(例如1000秒):
1 2 | var string = numeral(1000).format('00:00'); // '00:16:40' |
如果差异是片刻
1 2 3 | var diff = moment(20111031) - moment(20111010); var formated1 = moment(diff).format("hh:mm:ss"); console.log("format 1:"+formated1); |
在以下情况下,我使用经典格式功能:
1 2 3 4 | var diff = moment(end).unix() - moment(start).unix(); //use unix function instead of difference moment.unix(diff).format('hh:mm:ss') |
这是骇客,因为时间差异被视为标准时刻,是较早的日期,但对我们的目标而言并不重要,您不需要任何插件
根据ni-ko-o-kin的回答:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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 |
如果必须显示所有小时数(大于24),并且如果不需要在小时前显示" 0",则可以使用一小段代码完成格式化:
1 | Math.floor(duration.as('h')) + moment.utc(duration.as('ms')).format(':mm:ss') |
如果使用角度,则将其添加到过滤器中:
1 2 3 4 5 6 7 8 9 10 11 12 | .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 ': '') } }) |
使用范例
1 | {{diff | durationFormat}} |
将持续时间格式化为字符串
1 2 3 4 5 6 7 8 9 10 11 12 | 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"); } |
我的解决方案不涉及任何其他库,并且适用于diff> 24h
1 2 | 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)) |
原生javascript怎么样?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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; } |
使用矩持续时间格式。
客户端框架(例如:React)
1 2 3 4 5 | import moment from 'moment'; import momentDurationFormatSetup from 'moment-duration-format'; momentDurationFormatSetup(moment); const breakLengthInMinutes = moment.duration(breakLengthInSeconds, 's').format('m'); |
服务器(node.js)
1 2 3 4 5 6 | const moment = require("moment-timezone"); const momentDurationFormatSetup = require("moment-duration-format"); momentDurationFormatSetup(moment); const breakLengthInMinutes = moment.duration(breakLengthInSeconds, 's').format('m'); |
我需要执行此操作,以显示这种格式的小时数。
起初我尝试了这个。
1 | moment.utc(totalMilliseconds).format("HH:mm:ss") |
但是,超过24小时的所有时间都会将小时重置为0。
但是分钟和秒是准确的。
所以我只用了几分钟和几秒钟。
1 | var minutesSeconds = moment.utc(totalMilliseconds).format("mm:ss") |
现在我只需要总时间。
1 | var hours = moment.duration(totalMilliseconds).asHours().toFixed() |
为了获得我们都希望的格式,我们将其粘合在一起。
1 | var formatted = hours +":" + minutesSeconds |
如果
希望能有所帮助。在评论中留下任何问题。 ;)
1 2 3 4 5 | 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 days 14 h 00 min 00 s
1 2 3 4 5 6 7 8 9 10 | 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`); })(); |
1 | 0h:0m:1s |
这可用于获取前两个字符(小时)和后两个字符(分钟)。相同的逻辑可以应用于秒。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | /** * 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')); |
1 2 3 | <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment-with-locales.min.js"> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"> |
您可以使用
1 | console.log(moment.utc(4366589).format("HH:mm:ss")) |
1 2 | <script src="https://momentjs.com/downloads/moment.js"> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"> |
如何正确使用moment.js持续时间?
|
在代码中使用moment.duration()
首先,您需要导入
1 2 | import moment from 'moment'; import 'moment-duration-format'; |
然后,使用持续时间功能。让我们应用上面的示例:28800 = 8 am。
1 | moment.duration(28800,"seconds").format("h:mm a"); |
嗯,您没有上述类型错误。您是否在8:00上午获得正确的值?不,您获得的价值是8:00。 Moment.js格式无法正常运行。
解决方案是将秒转换为毫秒,并使用UTC时间。
1 | moment.utc(moment.duration(value, 'seconds').asMilliseconds()).format('h:mm a') |
好吧,我们现在早上8:00。如果您希望整点时间是上午8点而不是8:00点,则需要执行RegExp
1 2 | const time = moment.utc(moment.duration(value, 'seconds').asMilliseconds()).format('h:mm a'); time.replace(/:00/g, '') |
您可以使用digit.js设置持续时间的格式:
1 | numeral(your_duration.asSeconds()).format('00:00:00') // result: hh:mm:ss |
如果您使用Angular> 2,我会根据@ hai-alaluf的答案来制作一个Pipe。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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 :""); } } |
这对我有用:
1 | moment({minutes: 150}).format('HH:mm') // 01:30 |