我有什么方法可以在持续时间对象上使用moment.js format
方法吗?我无法在文档中的任何位置找到它,也不会将其视为持续时间对象的属性。
我希望能够做到这样的事情:
var diff = moment(end).unix() - moment(start).unix();
moment.duration(diff).format('hh:mm:ss')
此外,如果有任何其他库可以轻松容纳这种功能,我会对reccomendations感兴趣。
谢谢!
答案 0 :(得分:140)
// 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);
答案 1 :(得分:50)
我们正在研究在moment.js中为持续时间添加某种格式。见https://github.com/timrwood/moment/issues/463
其他可能有用的图书馆有http://countdownjs.org/和https://github.com/icambron/twix.js
答案 2 :(得分:44)
将持续时间转换为ms,然后转换为时刻:
import acm.program.*;
import acm.util.*;
public class AddCommasToNumericString extends ConsoleProgram{
public void run(){
while(true){
String digits = readLine("Enter a numeric string: ");
if (digits.length() == 0) break;
println(addCommasToNumericString(digits));
}
}
public String addCommasToNumericString(String digits){
String result = "";
int counter = 0;
for (int i = digits.length()-1; i <= 0 ; i--){
char ch = digits.charAt(i);
result = ch + result;
counter++;
if (counter % 3 == 0){
result = "," + result;
}
}
return result;
}
}
答案 3 :(得分:38)
答案 4 :(得分:14)
var diff = moment(end).unix() - moment(start).unix();
moment.utc(moment.duration(diff).asMilliseconds()).format("HH:mm:ss.SSS");
答案 5 :(得分:10)
我的特定用例的最佳方案是:
var duration = moment.duration("09:30"),
formatted = moment.utc(duration.asMilliseconds()).format("HH:mm");
这改善了@ Wilson的答案,因为它不访问私有内部属性_data。
答案 6 :(得分:8)
我用:
var duration = moment.duration("09:30");
var str = moment(duration._data).format("HH:mm");
我得到&#34; 09:30&#34;在var str。
答案 7 :(得分:6)
您不需要.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
答案 8 :(得分:5)
在这些情况下我使用经典格式函数:
var diff = moment(end).unix() - moment(start).unix();
//use unix function instead of difference
moment.unix(diff).format('hh:mm:ss')
这是一个黑客,因为时间差异被视为标准时刻日期,即早期的纪元日期时间,但它对我们的目标并不重要,您不需要任何插件
答案 9 :(得分:5)
如果您愿意使用其他javascript库,numeral.js可以按如下方式格式化秒数(示例为1000秒):
var string = numeral(1000).format('00:00');
// '00:16:40'
答案 10 :(得分:4)
如果差异是片刻
var diff = moment(20111031) - moment(20111010);
var formated1 = moment(diff).format("hh:mm:ss");
console.log("format 1: "+formated1);
答案 11 :(得分:3)
如果您使用角度将此添加到您的过滤器:
.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>
答案 12 :(得分:3)
如果必须显示所有小时数(超过24小时),并且如果&#39; 0&#39;在没有必要的时间之前,可以用一小段代码完成格式化:
Math.floor(duration.as('h')) + moment.utc(duration.as('ms')).format(':mm:ss')
答案 13 :(得分:3)
将片段持续时间格式化为字符串
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");
}
答案 14 :(得分:3)
for {
a <- executeA()
_ <- executeB(b).recover{case e => println(e); Future.unit } // awaits B to complete
} yield a
答案 15 :(得分:3)
我需要执行此操作,才能以这种格式显示小时数。 一开始我尝试了这个。
lazy var blackButton:UIButton = {
var button = UIButton()
button.layer.cornerRadius = 8
button.backgroundColor = .black
return button
}()
override init(frame: CGRect) {
super.init(frame: .zero)
setupView() //set up constraints
}
但是,超过24小时的任何时间都会将小时重置为0。 但是分钟和秒是准确的。 所以我只用了几分钟和几秒钟。
func setUpBottom() -> Void {
if dataInfo!.user_id! == UserSettings.userModel.id
{
self.backView.addSubview(addvertView) //also works
addvertView.snp.makeConstraints //works
{
(make) in
make.left.equalToSuperview()
make.top.equalTo(userView.snp.bottom).offset(24)
make.height.equalTo(450)
make.bottom.lessThanOrEqualTo(-34)
}
addvertView.blackButton.addTarget(self, action: #selector(blackButtonMethod), for: .touchUpInside) // does not add target
}
else {
backView.addSubview(buttonsView) //works
buttonsView.snp.makeConstraints { (make) in
make.left.right.equalToSuperview()
make.top.equalTo(userView.snp.bottom).offset(24)
make.bottom.lessThanOrEqualTo(-34)
}
buttonsView.skipButton.addTarget(self, action: #selector(toComplain), for: .touchUpInside) //works
}
@objc func toComplain(){ //works
let vc = ComplaintTypeViewController()
vc.advertID = dataInfo!.id!
navigationController?.pushViewController(vc, animated: true)
}
@objc func blackButtonMethod(){ //does not work
print("hello")
parameters["action"] = "hot"
parameters["advert_id"] = String(describing: dataInfo!.id)
updateAdvert(parameters: parameters)
}
现在我需要的是总时间。
moment.utc(totalMilliseconds).format("HH:mm:ss")
要获得我们都想要的格式,我们只需将其粘合在一起。
var minutesSeconds = moment.utc(totalMilliseconds).format("mm:ss")
如果var hours = moment.duration(totalMilliseconds).asHours().toFixed()
是var formatted = hours + ":" + minutesSeconds
,则将返回totalMilliseconds
。
希望能有所帮助。在评论中留下任何问题。 ;)
答案 16 :(得分:3)
我的解决方案不涉及任何其他库,并且适用于diff> 24h
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))
答案 17 :(得分:1)
原生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;
}
答案 18 :(得分:1)
不再需要(如果有的话)将持续时间转换为 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"
答案 19 :(得分:1)
moment.duration(x).format()
已过时。
您可以使用moment.utc(4366589).format("HH:mm:ss")
来获得所需的响应。
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>
答案 20 :(得分:1)
import moment from 'moment';
import momentDurationFormatSetup from 'moment-duration-format';
momentDurationFormatSetup(moment);
const breakLengthInMinutes = moment.duration(breakLengthInSeconds, 's').format('m');
const moment = require("moment-timezone");
const momentDurationFormatSetup = require("moment-duration-format");
momentDurationFormatSetup(moment);
const breakLengthInMinutes = moment.duration(breakLengthInSeconds, 's').format('m');
答案 21 :(得分:0)
短版(单行):
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")
}
示例:
答案 22 :(得分:0)
这可用于获取前两个字符(小时)和后两个字符(分钟)。相同的逻辑可能适用于秒。
/**
* 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>
答案 23 :(得分:0)
您可以使用numeral.js设置持续时间:
numeral(your_duration.asSeconds()).format('00:00:00') // result: hh:mm:ss
答案 24 :(得分:0)
这对我有用:
moment({minutes: 150}).format('HH:mm') // 01:30
答案 25 :(得分:0)
使用以下代码行:
moment.utc(moment.duration(4500, "seconds").asMilliseconds()).format("HH:mm:ss")
答案 26 :(得分: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
答案 27 :(得分: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}`);
打印:
2天14小时00分00秒
答案 28 :(得分:-1)
如果您使用Angular> 2,我会根据@ 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 : "");
}
}