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

时间:2012-11-07 03:13:12

标签: javascript momentjs

我有什么方法可以在持续时间对象上使用moment.js format方法吗?我无法在文档中的任何位置找到它,也不会将其视为持续时间对象的属性。

我希望能够做到这样的事情:

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

此外,如果有任何其他库可以轻松容纳这种功能,我会对reccomendations感兴趣。

谢谢!

29 个答案:

答案 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);

Have a look at the JSFiddle

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

使用此插件Moment Duration Format

示例:

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

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

基于ni-ko-o-kin's answer

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)

使用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');

答案 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")
}

示例:

Example cases

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