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.