Moment.js - bagaimana saya bisa mendapatkan jumlah tahun sejak kencan, tidak dibulatkan?


130

Saya mencoba menghitung usia seseorang menggunakan Moment.js , tapi saya menemukan bahwa metode fromNow yang berguna akan bertambah selama bertahun-tahun. Misalnya, jika hari ini 12/27/2012 dan tanggal lahir orang tersebut adalah 02/26/1978, moment("02/26/1978", "MM/DD/YYYY").fromNow()mengembalikan '35 tahun yang lalu '. Bagaimana saya bisa membuat Moment.js mengabaikan jumlah bulan, dan hanya mengembalikan jumlah tahun (yaitu 34) sejak tanggal?

Jawaban:


216

Menggunakan moment.js semudah:

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

Untuk referensi tambahan, Anda dapat membaca dokumentasi resmi moment.js .


30

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

jika Anda tidak ingin nilai fraksi:

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

jika Anda ingin nilai pecahan:

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

Unit bisa [detik, menit, jam, hari, minggu, bulan, tahun]


3
Teknik ini dicakup oleh jawaban @ ebeltran, dan diskusi Anda tentang nilai fraksional tidak ada hubungannya dengan pertanyaan. Saya lebih suka menambahkannya sebagai komentar.
aknuds1

21

Tampaknya ada fungsi perbedaan yang menerima interval waktu untuk digunakan serta opsi untuk tidak membulatkan hasil. Jadi, kira-kira seperti itu

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

Saya belum mencoba ini, dan saya tidak sepenuhnya akrab dengan momen, tetapi sepertinya ini harus mendapatkan apa yang Anda inginkan (tanpa harus mengatur ulang bulan).


Tampaknya Anda tidak perlu menerima nomor floating point dari saat ini dan kemudian membulatkannya sendiri, untuk skenario ini. Sepertinya saat ini benar pembulatan hasil untuk perhitungan tahun menggunakan diff.
chris

31
Dari docs, sejak 2.0.0, saat # diff akan kembali jumlah dibulatkan ke bawah, sehingga Anda hanya perlu: age = moment().diff(birthDate, 'years') .
SuperSkunk

13

Saya menemukan bahwa itu akan berhasil untuk mengatur ulang bulan ke Januari untuk kedua tanggal (tanggal yang disediakan dan sekarang):

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

3
Dalam moment.js v2.3.1 ada metode .fromNow () yang juga bisa membantu.
Lucas Lazaro

9

Metode ini mudah dan kuat.

Nilai adalah tanggal dan "DD-MM-YYYY" adalah topeng tanggal.

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

6

Coba ini:

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

Penjelasan:

Kami menerima string seperti ini: '23 hari yang lalu '. Bagi ke array: ['23', 'hari', 'lalu'] dan kemudian ambil item pertama '23'.


3
Posting ini secara otomatis ditandai sebagai kualitas rendah karena ini hanya kode. Maukah Anda memperluasnya dengan menambahkan beberapa teks untuk menjelaskan bagaimana menyelesaikan masalah?
Taifun

3

Metode ini bekerja untuk saya. Ini memeriksa apakah orang tersebut berulang tahun tahun ini dan mengurangi satu tahun sebaliknya.

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

Sunting: Versi pertama tidak cukup berfungsi. Yang diperbarui harus


Ini bekerja untuk saya jika saya mengubah hari tahun ke 365,25 menjadi tahun kabisat
bschipp

menggunakan 365.25 adalah perkiraan yang bisa berakhir dengan air mata - ketikkan cal 1752untuk melihat alasannya
pgee70

2

Jika Anda tidak ingin menggunakan modul apa pun untuk perhitungan usia

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

2

Saat Anda ingin menampilkan tahun dan hari-hari yang tersisa:

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

Saya lebih suka metode kecil ini.

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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.