13

ファイルのアップロード用に「残り時間」カウンターがあります。残りの期間は次のように計算され、ミリ秒に変換されます。

var elapsedTime = e.timeStamp - timestarted;
var speed = e.loaded / elapsedTime;
var estimatedTotalTime = e.totalSize / speed;
var timeLeftInSeconds = (estimatedTotalTime - elapsedTime) / 1000;

次に、人間化された文字列に組み込む予定の配列を作成します。配列は次のとおりです。

var time = {
              years : Math.round(moment.duration(timeLeftInSeconds, 'milliseconds').years()),
              months : Math.round(moment.duration(timeLeftInSeconds, 'milliseconds').months()),
              days : Math.round(moment.duration(timeLeftInSeconds, 'milliseconds').days()),
              hours : Math.round(moment.duration(timeLeftInSeconds, 'milliseconds').hours()),
              minutes : Math.round(moment.duration(timeLeftInSeconds, 'milliseconds').minutes()),
              seconds : Math.round(moment.duration(timeLeftInSeconds, 'milliseconds').seconds())
};

これはすべて完全に機能し、このデータの文字列表現を次のように出力すると、次のようになります。

  console.log(time.years + ' years, ' + time.months + ' months, ' + time.days + ' days, ' + time.hours + ' hours, '+ time.minutes + ' minutes, ' + time.seconds + ' seconds');

私はそれが次のように残り時間の素敵な単純なストリームを返します:

0 years, 0 months, 0 days, 0 hours, 1 minutes, 7 seconds

私が今やらなければならないことは、残り時間に応じて文字列が作成されるように、この出力を人間化することです。例えば

  • 残り2年3ヶ月
  • 残り1時間32分41秒
  • 残り7秒
  • 残り3分46秒
  • 残り6秒

など...など...

これで、moment.jsには期間を自動的に人間化する機能があり、単一の値に対しては正常に機能しますが、これには複数の可能な値(時間/分/秒など)が含まれる可能性があることがわかりました。

moment.jsを使用するか、手動で文字列を作成して、このデータを人間化するにはどうすればよいですか?

前もって感謝します。

4

4 に答える 4

13

私のHumanizeDuration.jsライブラリは、まさにあなたが望むもののように聞こえます:

humanizeDuration(1);         // "1 millisecond"
humanizeDuration(3000);      // "3 seconds"
humanizeDuration(2012);      // "2 seconds, 12 milliseconds"
humanizeDuration(97320000);  // "1 day, 3 hours, 2 minutes"

私の答えは少し遅れているように見えますが、おそらくそれは他の人がこの質問を見るのを助けるでしょう!

于 2014-02-17T22:34:13.127 に答える
10

私はあなたの最善の策はこのようなものになると思います:

function humanize(time){
    if(time.years   > 0){   return time.years   + ' years and '     + time.months   + ' months remaining';}
    if(time.months  > 0){   return time.months  + ' months and '    + time.days     + ' days remaining';}
    if(time.days    > 0){   return time.days    + ' days and '      + time.hours    + ' hours remaining';}
    if(time.hours   > 0){   return time.hours   + ' hours and '     + time.minutes  + ' minutes and ' + time.seconds + ' seconds remaining';}
    if(time.minutes > 0){   return time.minutes + ' minutes and '   + time.seconds  + ' seconds remaining';}
    if(time.seconds > 0){   return time.seconds + ' seconds remaining';}
    return "Time's up!";
}

または、次の関数を使用することもできます。

function humanize(time){
    var o = '';
    for(key in time){
        if(time[key] > 0){
            if(o === ''){
                o += time[key] + ' ' + key + ' ';
            }else{
                return o + 'and ' + time[key] + ' ' + key + ' remaining';
            }
        }
    }
    return o + 'remaining';
}

"x <time> and y <time> remaining"2つの最大値に対して、を返します。(または、最後のケースではわずか数秒。

于 2013-01-04T12:44:35.643 に答える
4

このプラグインを試してみてください:moment-duration-format

その構文は非常に便利です。

var moment = require('moment');
require("moment-duration-format");
moment.duration(32832, "seconds").format("h [hrs]: m [min]: s [sec]")
// => 9 hrs: 7 min: 12 sec" 
于 2015-08-12T04:02:30.890 に答える
0

私はdate-fnsのformatDistanceToNowに満足することになりました。moment.jsのようにライブラリ全体を追加しなくても、その関数を追加できます。

于 2020-01-23T09:24:37.360 に答える