245

期間オブジェクトでmoment.js メソッドを使用する方法はありますか?formatドキュメントのどこにも見つかりません。また、durationオブジェクトの属性とは見なされません。

私は次のようなことができるようになりたいです:

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

また、この種の機能に簡単に対応できるライブラリが他にある場合は、推奨事項に興味があります。

ありがとう!

4

31 に答える 31

190
// 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をご覧ください

于 2014-01-07T20:44:19.540 に答える
87

期間をミリ秒に変換してからモーメントに変換します。

moment.utc(duration.as('milliseconds')).format('HH:mm:ss')
于 2017-01-03T23:25:58.700 に答える
60

moment.jsの期間にある種のフォーマットを追加することを検討しています。https://github.com/timrwood/moment/issues/463を参照してください

役立つ可能性のある他のいくつかのライブラリは、http://countdownjs.org/https://github.com/icambron/twix.jsです。

于 2012-11-07T17:03:00.683 に答える
46

このプラグインのモーメント持続時間フォーマットを使用します。

例:

moment.duration(123, "minutes").format("h:mm");
于 2014-08-19T14:32:52.977 に答える
25

次のコード行を使用します。

moment.utc(moment.duration(4500, "seconds").asMilliseconds()).format("HH:mm:ss")
于 2019-05-22T14:42:16.893 に答える
16
var diff = moment(end).unix() - moment(start).unix();
moment.utc(moment.duration(diff).asMilliseconds()).format("HH:mm:ss.SSS");
于 2015-05-20T00:46:27.743 に答える
14

私の特定のユースケースに最適なシナリオは次のとおりです。

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

これは、プライベート内部プロパティ_dataにアクセスしないため、@Wilsonの回答を改善します。

于 2018-02-09T09:19:29.917 に答える
12

.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
于 2017-05-19T13:53:09.920 に答える
8

私が使う:

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

そして、varstrで「09:30」を取得します。

于 2015-10-30T15:33:46.037 に答える
8

この形式で時間を表示するための要件として、作業のためにこれを行う必要がありました。最初はこれを試してみました。

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ます。

お役に立てば幸いです。コメントに質問を残してください。;)

于 2020-05-14T16:48:48.113 に答える
5

差分が瞬間の場合

var diff = moment(20111031) - moment(20111010);
var formated1 = moment(diff).format("hh:mm:ss");
console.log("format 1: "+formated1);
于 2012-11-07T04:07:47.367 に答える
5

別のjavascriptライブラリを使用する場合、numeric.jsは次のように秒をフォーマットできます(例は1000秒の場合)。

var string = numeral(1000).format('00:00');
// '00:16:40'
于 2014-08-22T00:21:09.683 に答える
5

すべての時間を表示する必要があり(24を超える)、時間の前に「0」を表示する必要がない場合は、短いコード行でフォーマットを実行できます。

Math.floor(duration.as('h')) + moment.utc(duration.as('ms')).format(':mm:ss')
于 2017-11-17T15:21:52.143 に答える
5

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
于 2018-12-11T16:08:14.790 に答える
4

これらの場合、クラシックフォーマット関数を使用します。

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

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

time diffは標準の瞬間の日付、つまりエポックの早い日付として扱われるため、これはハックですが、目標には関係なく、プラグインは必要ありません。

于 2014-11-18T09:44:35.547 に答える
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");
}
于 2016-05-30T16:48:40.717 に答える
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>
于 2016-12-18T15:33:47.813 に答える
3

他のライブラリを含まず、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))
于 2019-08-22T16:08:12.033 に答える
2

ネイティブ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;
}
于 2017-05-02T19:32:51.453 に答える
2

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>

于 2020-02-19T10:51:17.917 に答える
2

moment.jsの期間を正しく使用するにはどうすればよいですか? | コードでmoment.duration()を使用する

まず、インポートする必要がありmomentますmoment-duration-format

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

次に、duration関数を使用します。上記の例を適用してみましょう:28800 =8am。

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

さて、上記のタイプエラーはありません。午前8時に正しい値が得られますか?いいえ…、得られる値は8:00aです。Moment.js形式が想定どおりに機能していません。

解決策は、秒をミリ秒に変換し、UTC時間を使用することです。

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

了解しました。今は午前8時です。積分時間の午前8時ではなく午前8時が必要な場合は、正規表現を実行する必要があります

const time = moment.utc(moment.duration(value, 'seconds').asMilliseconds()).format('h:mm a');
time.replace(/:00/g, '')
于 2020-05-08T08:55:19.757 に答える
2

ショートバージョン(ワンライナー):

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

例:

事例例

于 2021-08-11T11:16:12.503 に答える
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');
于 2020-01-27T03:43:26.330 に答える
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"
于 2021-03-14T23:40:15.970 に答える
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秒

于 2019-03-15T23:12:29.363 に答える
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
于 2019-05-02T04:38:29.810 に答える
0

数値.jsを使用して、期間をフォーマットできます。

numeral(your_duration.asSeconds()).format('00:00:00') // result: hh:mm:ss
于 2019-11-26T13:57:49.987 に答える
0

これを使用して、最初の2文字を時間、最後の2文字を分として取得できます。同じロジックを秒に適用できます。

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

于 2020-02-05T19:32:31.933 に答える
0

他のプラグインなしでmoment.jsだけ

moment().startOf('day').seconds(duration).format('HH:mm:ss')
于 2021-10-15T09:46:41.603 に答える
-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 : "");
  }
}
于 2018-11-30T15:56:52.093 に答える
-3

これは私のために働きます:

moment({minutes: 150}).format('HH:mm') // 01:30
于 2019-05-22T21:58:01.710 に答える