Moment.jsでこれを試しました
moment.duration(375,'days').humanize()
そして、答えとして"a year"を取得しますが、「a year and 10 days」が期待されます。 moment.jsに完全な人間化された価値を得る方法はありますか?
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が提案するサードパーティのライブラリを使用する必要があります
持続時間を表示するだけの小さなライブラリを見つけました(moment.jsのすべての機能が本当に必要ない場合)
私は同じ問題を見ていましたが、今後これをサポートする計画はないようです...
提案された回避策の1つは、人間化されたメッセージのオーバーライドデフォルトの実装を定義することです:
https://github.com/timrwood/moment/issues/348
あなたが私に尋ねるなら、やり過ぎのような...
このプラグインを試してください:
https://github.com/jsmreese/moment-duration-format
moment.duration(123, "minutes").format("h [hrs], m [min]");
// "2 hrs, 3 min"
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);
この問題 Githubには、まさにそれに関する多くの議論が含まれています。多くは、より正確な人間化されたオプションを求めています。
なぜそれが必要なのか、ユースケースなどを知らせてください.
期間を人間化するためにこの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;
}
これは私の解決策です、私はここで他のものよりもそれが好きです:
val moment1 = moment();
val moment2 = mement();
console.log(moment.duration(moment1.diff(moment2)).humanize());
解決策の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は開始日について何も言っていないので、数ヶ月では意味がありません。期間を部分に分割して、「日」/「時間」/ ...を追加するのは明らかです。
これは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()