Moment.js を使用して人の年齢を計算しようとしていますが、それ以外の場合は便利な fromNow メソッドが年を切り上げていることがわかります。たとえば、今日が2012年12月27日で、その人の生年月日が1978年2月26日である場合、moment("02/26/1978", "MM/DD/YYYY").fromNow()
は'35年前 'を返します。 Moment.jsで月数を無視し、日付から単純に年数(つまり34)を返すようにするにはどうすればよいですか?
両方の日付(指定された日付と現在)で月を1月にリセットするとうまくいくことがわかりました。
> moment("02/26/1978", "MM/DD/YYYY").month(0).from(moment().month(0))
"34 years ago"
Moment.jsの使用は次のように簡単です。
var years = moment().diff('1981-01-01', 'years');
var days = moment().diff('1981-01-01', 'days');
追加の参照については、moment.js 公式ドキュメント を参照してください。
分数の値が必要ない場合:
var years = moment().diff('1981-01-01', 'years',false);
alert( years);
小数部の値が必要な場合:
var years = moment().diff('1981-01-01', 'years',true);
alert( years);
単位は[秒、分、時間、日、週、月、年]です。
使用する時間間隔を受け入れる 差分関数 と、結果を丸めるnotのオプションがあるようです。だから、のようなもの
Math.floor(moment(new Date()).diff(moment("02/26/1978","MM/DD/YYYY"),'years',true)))
私はこれを試したことはありませんし、私は瞬間に完全に精通していませんが、これはあなたが望むものを(月をリセットすることなく)得るはずのようです。
この方法は簡単で強力です。
値は日付で、「DD-MM-YYYY」は日付のマスクです。
moment().diff(moment(value, "DD-MM-YYYY"), 'years');
これを試して:
moment("02/26/1978", "MM/DD/YYYY").fromNow().split(" ")[0];
説明:
「23日前」のような文字列を受け取ります。配列に分割します:['23'、 'days'、 'ago']そして、最初の項目 '23'を取得します。
この方法は私には有効です。その人が今年誕生日を迎えたかどうかをチェックし、そうでなければ1年を差し引きます。
// date is the moment you're calculating the age of
var now = moment().unix();
var then = date.unix();
var diff = (now - then) / (60 * 60 * 24 * 365);
var years = Math.floor(diff);
編集:最初のバージョンは完全に機能しませんでした。更新されたものは
年と残りの日を表示する場合:
var m = moment(d.birthday.date, "DD.MM.YYYY");
var years = moment().diff(m, 'years', false);
var days = moment().diff(m.add(years, 'years'), 'days', false);
alert(years + ' years, ' + days + ' days');
年齢の計算にモジュールを使用したくない場合
var age = Math.floor((new Date() - new Date(date_of_birth)) / 1000 / 60 / 60 / 24 / 365.25)
私はこの小さな方法を好みます。
function getAgeFromBirthday(birthday) {
if(birthday){
var totalMonths = moment().diff(birthday, 'months');
var years = parseInt(totalMonths / 12);
var months = totalMonths % 12;
if(months !== 0){
return parseFloat(years + '.' + months);
}
return years;
}
return null;
}