Moment.js - ฉันจะหาจำนวนปีนับจากวันที่ไม่ปัดเศษได้อย่างไร


131

ฉันกำลังพยายามคำนวณอายุของบุคคลโดยใช้Moment.jsแต่ฉันพบว่าเมธอดfromNowมีประโยชน์อย่างอื่นจะวนรอบปี ตัวอย่างเช่นหากวันนี้คือ 27 ธันวาคม 2555 และวันเกิดของบุคคลนั้นคือ 02/26/1978 moment("02/26/1978", "MM/DD/YYYY").fromNow()จะส่งกลับ '35 ปีที่แล้ว ' ฉันจะทำให้ Moment.js ละเว้นจำนวนเดือนได้อย่างไรและเพียงส่งคืนจำนวนปี (เช่น 34) นับตั้งแต่วันที่

คำตอบ:


218

การใช้ moment.js นั้นง่ายพอ ๆ กับ:

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

สำหรับการอ้างอิงเพิ่มเติมคุณสามารถอ่าน moment.js เอกสารอย่างเป็นทางการ


30

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

หากคุณไม่ต้องการค่าเศษส่วน:

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

หากคุณต้องการค่าเศษส่วน:

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

หน่วยสามารถเป็น [วินาทีนาทีชั่วโมงวันสัปดาห์เดือนปี]


3
เทคนิคนี้ครอบคลุมโดยคำตอบของ @ ebeltran และการสนทนาเรื่องค่าเศษส่วนไม่เกี่ยวข้องกับคำถาม ฉันอยากจะเพิ่มเป็นความคิดเห็น
aknuds1

21

ดูเหมือนจะมีฟังก์ชันความแตกต่างที่ยอมรับช่วงเวลาที่จะใช้เช่นเดียวกับตัวเลือกที่จะไม่ปัดเศษผลลัพธ์ ดังนั้นสิ่งที่ชอบ

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

ฉันยังไม่ได้ลองสิ่งนี้และฉันก็ไม่คุ้นเคยกับช่วงเวลานี้ แต่ดูเหมือนว่าสิ่งนี้ควรได้รับสิ่งที่คุณต้องการ (โดยไม่ต้องรีเซ็ตเดือน)


ดูเหมือนว่าคุณไม่จำเป็นต้องรับเลขทศนิยมจากนั้นจึงปัดเศษด้วยตัวคุณเองสำหรับสถานการณ์นี้ ดูเหมือนว่าโมเมนต์จะปัดเศษผลลัพธ์อย่างถูกต้องสำหรับการคำนวณปีโดยใช้ค่าต่าง
chris

31
จากเอกสารตั้งแต่ 2.0.0 ขณะ # diff age = moment().diff(birthDate, 'years') จะกลับจำนวนปัดเศษลงดังนั้นคุณต้องเท่านั้น:
SuperSkunk

13

ฉันพบว่ามันจะใช้งานได้ในการรีเซ็ตเดือนเป็นมกราคมสำหรับทั้งสองวัน (วันที่ที่ระบุและปัจจุบัน):

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

3
ใน moment.js v2.3.1 มีวิธีการ. fromNow () ซึ่งอาจเป็นประโยชน์
Lucas Lazaro

9

วิธีนี้ง่ายและมีประสิทธิภาพ

ค่าคือวันที่และ "DD-MM-YYYY" คือมาสก์ของวันที่

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

6

ลองสิ่งนี้:

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

คำอธิบาย:

เราได้รับสตริงในลักษณะนี้: '23 days ago ' แบ่งเป็นอาร์เรย์: ['23', 'days', 'ago'] จากนั้นใช้รายการแรก '23'


3
โพสต์นี้ถูกระบุว่ามีคุณภาพต่ำโดยอัตโนมัติเนื่องจากเป็นเพียงโค้ดเท่านั้น คุณช่วยขยายความโดยการเพิ่มข้อความเพื่ออธิบายวิธีแก้ปัญหาได้หรือไม่
Taifun

3

วิธีนี้ใช้ได้กับฉัน กำลังตรวจสอบว่าบุคคลนั้นมีวันเกิดในปีนี้หรือไม่และลบหนึ่งปีเป็นอย่างอื่น

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

แก้ไข: เวอร์ชันแรกทำงานได้ไม่สมบูรณ์ สิ่งที่อัปเดตควร


สิ่งนี้ใช้ได้ผลสำหรับฉันถ้าฉันเปลี่ยนวันของปีเป็น 365.25 เป็นปีอธิกสุรทิน
bschipp

การใช้ 365.25 เป็นการประมาณที่สามารถจบลงด้วยน้ำตา - ประเภท cal 1752
ซึม

2

หากคุณไม่ต้องการใช้โมดูลใด ๆ ในการคำนวณอายุ

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

2

เมื่อคุณต้องการแสดงปีและวันที่เหลือ:

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

ฉันชอบวิธีการเล็ก ๆ นี้มากกว่า

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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.