Moment.js - Bir tarihten itibaren geçen yılların sayısını yuvarlamadan nasıl alabilirim?


131

Moment.js kullanarak bir kişinin yaşını hesaplamaya çalışıyorum , ancak bunun dışında yararlı olan fromNow yönteminin yılları tamamladığını görüyorum . Örneğin, bugün 12/27/2012 ve kişinin doğum tarihi 02/26/1978 ise, moment("02/26/1978", "MM/DD/YYYY").fromNow()'35 yıl önce 'döndürür. Moment.js'nin ay sayısını göz ardı etmesini ve sadece tarihten itibaren yıl sayısını (yani 34) döndürmesini nasıl sağlayabilirim?

Yanıtlar:


218

Moment.js'yi kullanmak şu kadar kolaydır:

var years = moment().diff('1981-01-01', 'years');
var days = moment().diff('1981-01-01', 'days');

Ek referans için moment.js resmi belgelerini okuyabilirsiniz .


30

http://jsfiddle.net/xR8t5/27/

kesir değerlerini istemiyorsanız:

var years = moment().diff('1981-01-01', 'years',false);
alert( years);

kesir değerleri istiyorsanız:

var years = moment().diff('1981-01-01', 'years',true);
alert( years);

Birimler [saniye, dakika, saat, gün, hafta, ay, yıl] olabilir


3
Bu teknik, @ ebeltran'ın cevabı kapsamındadır ve kesirli değerler hakkındaki tartışmanızın soruyla hiçbir ilgisi yoktur. Yorum olarak eklemeyi tercih ederim.
aknuds1

21

Bir olduğu görülmektedir fark fonksiyonu zaman aralıkları için bir seçenek gibi kullanmayı kabul eder değil sonucu yuvarlak. Yani, şöyle bir şey

Math.floor(moment(new Date()).diff(moment("02/26/1978","MM/DD/YYYY"),'years',true)))

Bunu denemedim ve ana tam olarak aşina değilim, ancak bunun istediğinizi alması gerekiyor gibi görünüyor (ayı sıfırlamak zorunda kalmadan).


Görünüşe göre, bu senaryo için kayan nokta numarasını o andan itibaren alıp sonra kendi kendinize yuvarlamanız gerekmiyor. Görünüşe göre moment, diff kullanarak yıl hesaplaması için sonucu doğru şekilde yuvarlıyor.
chris

31
Yalnızca gerek böylece dokümanlar itibaren 2.0.0 beri, sayı döndürür an # fark, aşağı yuvarlanır: age = moment().diff(birthDate, 'years') .
SuperSkunk

13

Her iki tarih için de ayı Ocak olarak sıfırlamanın işe yarayacağını buldum (sağlanan tarih ve şimdiki tarih):

> moment("02/26/1978", "MM/DD/YYYY").month(0).from(moment().month(0))
"34 years ago"

3
Moment.js v2.3.1'de, yardımcı olabilecek bir .fromNow () yöntemi vardır.
Lucas Lazaro

9

Bu yöntem kolay ve güçlüdür.

Değer bir tarih ve "GG-AA-YYYY" tarih maskesidir.

moment().diff(moment(value, "DD-MM-YYYY"), 'years');

6

Bunu dene:

 moment("02/26/1978", "MM/DD/YYYY").fromNow().split(" ")[0];

Açıklama:

Dize şöyle bir şey alıyoruz: '23 gün önce'. Diziye bölün: ['23', 'günler', 'önce'] ve ardından ilk öğe '23'ü alın.


3
Bu gönderi, yalnızca kod olduğu için otomatik olarak düşük kaliteli olarak işaretleniyor. Sorunu nasıl çözdüğünü açıklamak için biraz metin ekleyerek genişletebilir misiniz?
Taifun

3

Bu yöntem benim için çalışıyor. Kişinin bu yıl doğum gününü yapıp yapmadığını kontrol ediyor ve aksi takdirde bir yıl çıkarıyor.

// 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);

Düzenleme: İlk sürüm tam olarak mükemmel çalışmadı. Güncellenmiş olan


Artık yılları hesaba katmak için yılın günlerini 365.25 olarak değiştirirsem bu benim için çalıştı
bschipp

365.25 kullanmak, gözyaşlarına cal 1752neden
olabilecek bir tahmintir

2

Yaş hesaplaması için herhangi bir modül kullanmak istemiyorsanız

var age = Math.floor((new Date() - new Date(date_of_birth)) / 1000 / 60 / 60 / 24 / 365.25)

2

Yılları ve kalan günleri göstermek istediğinizde:

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');

0

Bu küçük yöntemi tercih ediyorum.

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.