web-dev-qa-db-ja.com

moment.jsの完全な人間化された期間

Moment.jsでこれを試しました

moment.duration(375,'days').humanize()

そして、答えとして"a year"を取得しますが、「a year and 10 days」が期待されます。 moment.jsに完全な人間化された価値を得る方法はありますか?

46
husayt

Moment.jsはfromNow関数を提供して、人間が読める形式で時間を取得します。 http://momentjs.com/docs/#/displaying/fromnow/ を参照してください。

例:

moment([2007, 0, 29]).fromNow(); // 4 years ago
moment().subtract(375, 'days').fromNow(); // a year ago

@Fluffyが提案するサードパーティのライブラリを使用する必要があります

19
Kishore Relangi

持続時間を表示するだけの小さなライブラリを見つけました(moment.jsのすべての機能が本当に必要ない場合)

https://github.com/EvanHahn/HumanizeDuration.js

18
Nicolas C

私は同じ問題を見ていましたが、今後これをサポートする計画はないようです...

提案された回避策の1つは、人間化されたメッセージのオーバーライドデフォルトの実装を定義することです:

https://github.com/timrwood/moment/issues/348

あなたが私に尋ねるなら、やり過ぎのような...

10
pflopez

このプラグインを試してください:

https://github.com/jsmreese/moment-duration-format

moment.duration(123, "minutes").format("h [hrs], m [min]");
// "2 hrs, 3 min"
9
Fluffy

moment.relativeTimeThreshold('y', 365) を使用して、丸めを設定します。

moment.relativeTimeThreshold('s', 60);
moment.relativeTimeThreshold('m', 60);
moment.relativeTimeThreshold('h', 24);
moment.relativeTimeThreshold('d', 31);
moment.relativeTimeThreshold('M', 12);
moment.relativeTimeThreshold('y', 365);
5
RJFalconer

この問題 Githubには、まさにそれに関する多くの議論が含まれています。多くは、より正確な人間化されたオプションを求めています。

なぜそれが必要なのか、ユースケースなどを知らせてください.

https://github.com/moment/moment/issues/348

2
Joshua Dance

期間を人間化するためにこのJavaScriptコードを記述しましたが、

function humanizeDuration(timeInMillisecond) {
    var result = "";
    if (timeInMillisecond) {
        if ((result = Math.round(timeInMillisecond / (1000 * 60 * 60 * 24 * 30 * 12))) > 0) {//year
            result = result === 1 ? result + " Year" : result + " Years";
        } else if ((result = Math.round(timeInMillisecond / (1000 * 60 * 60 * 24 * 30))) > 0) {//months
            result = result === 1 ? result + " Month" : result + " Months";
        } else if ((result = Math.round(timeInMillisecond / (1000 * 60 * 60 * 24))) > 0) {//days
            result = result === 1 ? result + " Day" : result + " Days";
        } else if ((result = Math.round(timeInMillisecond / (1000 * 60 * 60))) > 0) {//Hours
            result = result === 1 ? result + " Hours" : result + " Hours";
        } else if ((result = Math.round(timeInMillisecond / (1000 * 60))) > 0) {//minute
            result = result === 1 ? result + " Minute" : result + " Minutes";
        } else if ((result = Math.round(timeInMillisecond / 1000)) > 0) {//second
            result = result === 1 ? result + " Second" : result + " Seconds";
        } else {
            result = timeInMillisecond + " Millisec";
        }
    }
    return result;
}
1
shyam_

これは私の解決策です、私はここで他のものよりもそれが好きです:

val moment1 = moment();
val moment2 = mement();
console.log(moment.duration(moment1.diff(moment2)).humanize());
0
jhilden

解決策の1つ:

function getCountdown() {
  // diff in seconds, comes through function's params
  const diff = 60*60*24*4 + 60*60*22 + 60*35 + 5;
  const MINUTE = 60;
  const HOUR = MINUTE * 60;
  const DAY = HOUR * 24;

  const days = Math.floor(diff / DAY);
  const hDiff = diff % DAY;
  const hours = Math.floor(hDiff / HOUR);
  const mDiff = hDiff % HOUR;
  const minutes = Math.floor(mDiff / MINUTE);
  const seconds = mDiff % MINUTE;

  return [days, hours, minutes, seconds]
    .map(v => (''+v)[1] ? ''+v : '0'+v)
}


output: ["04", "22", "35", "05"]

数日まで必要でしたが、数週間まで簡単に延長できます。 diffは開始日について何も言っていないので、数ヶ月では意味がありません。期間を部分に分割して、「日」/「時間」/ ...を追加するのは明らかです。

0

これはCoffeeScriptに関する私のソリューションです:

humanizeDuration = (eventDuration)->
    eventMDuration = Moment.duration(eventDuration, 'seconds');
    eventDurationString = ""
    if (eventMDuration.days() > 0)
        eventDurationString += " " + Moment.duration(eventMDuration.days(), 'days').humanize()
    if (eventMDuration.hours() > 0)
        eventDurationString += " " + Moment.duration(eventMDuration.hours(), 'hours').humanize()
    if (eventMDuration.minutes() > 0)
        eventDurationString += " " + Moment.duration(eventMDuration.minutes(), 'minutes').humanize()

    eventDurationString.trim()
0