Moment.js - làm cách nào để tôi có được số năm kể từ ngày, không được làm tròn?


130

Tôi đang cố gắng tính tuổi của một người bằng cách sử dụng Moment.js , nhưng tôi thấy rằng phương thức hữu ích khác từ phương thức làm tròn số năm. Chẳng hạn, nếu hôm nay là 27/12/2012 và ngày sinh của người đó là 26/2/1978, moment("02/26/1978", "MM/DD/YYYY").fromNow()trả về '35 năm trước '. Làm cách nào tôi có thể làm cho Moment.js bỏ qua số tháng và chỉ cần trả về số năm (tức là 34) kể từ ngày?

Câu trả lời:



30

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

nếu bạn không muốn các giá trị phân số:

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

nếu bạn muốn giá trị phân số:

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

Đơn vị có thể là [giây, phút, giờ, ngày, tuần, tháng, năm]


3
Kỹ thuật này được bao phủ bởi câu trả lời của @ ebeltran và thảo luận của bạn về các giá trị phân số không liên quan gì đến câu hỏi. Tôi muốn thêm nó như là một bình luận.
aknuds1

21

Dường như có một hàm khác biệt chấp nhận khoảng thời gian sử dụng cũng như tùy chọn không làm tròn kết quả. Vì vậy, một cái gì đó như

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

Tôi đã không thử điều này và tôi không hoàn toàn quen thuộc với khoảnh khắc này, nhưng có vẻ như điều này sẽ đạt được những gì bạn muốn (mà không phải đặt lại tháng).


Có vẻ như bạn không cần phải nhận số dấu phẩy động từ lúc này và sau đó tự làm tròn nó cho kịch bản này. Có vẻ như khoảnh khắc đang làm tròn chính xác kết quả tính toán năm bằng diff.
chris

31
Từ các tài liệu, kể từ 2.0.0, khoảnh khắc # diff sẽ trả về số được làm tròn xuống, vì vậy bạn chỉ cần : age = moment().diff(birthDate, 'years') .
SuperSkunk

13

Tôi thấy rằng nó sẽ hoạt động để đặt lại tháng thành tháng một cho cả hai ngày (ngày được cung cấp và hiện tại):

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

3
Trong khoảnh khắc.js v2.3.1, có một phương thức .fromNow () cũng có thể hữu ích.
Lucas Lazaro

9

Phương pháp này dễ dàng và mạnh mẽ.

Giá trị là một ngày và "DD-MM-YYYY" là mặt nạ của ngày.

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

6

Thử cái này:

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

Giải trình:

Chúng tôi nhận được một chuỗi như thế này: '23 ngày trước '. Chia nó thành mảng: ['23', 'ngày', 'trước'] và sau đó lấy mục đầu tiên '23'.


3
Bài đăng này đang được tự động gắn cờ là chất lượng thấp vì nó chỉ là mã. Bạn có muốn mở rộng nó bằng cách thêm một số văn bản để giải thích cách giải quyết vấn đề không?
Taifun

3

Phương pháp này hiệu quả với tôi. Đó là kiểm tra xem người đó đã có sinh nhật của họ trong năm nay chưa và trừ đi một năm nếu không.

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

Chỉnh sửa: Phiên bản đầu tiên không hoạt động hoàn hảo. Một cập nhật nên


Điều này hiệu quả với tôi nếu tôi thay đổi các ngày trong năm thành 365,25 để tính đến những năm nhuận
bschipp

sử dụng 365.25 là một xấp xỉ có thể kết thúc trong nước mắt - gõ cal 1752để xem tại sao
pgee70

2

Nếu bạn không muốn sử dụng bất kỳ mô-đun để tính tuổi

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

2

Khi bạn muốn hiển thị năm và những ngày còn lại:

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

Tôi thích phương pháp nhỏ này.

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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.