Tính tuổi cho ngày sinh theo định dạng YYYYMMDD


285

Làm cách nào tôi có thể tính tuổi theo năm, được đưa ra ngày sinh có định dạng YYYYMMDD? Có thể sử dụng Date()chức năng?

Tôi đang tìm kiếm một giải pháp tốt hơn giải pháp tôi đang sử dụng hiện nay:

var dob = '19800810';
var year = Number(dob.substr(0, 4));
var month = Number(dob.substr(4, 2)) - 1;
var day = Number(dob.substr(6, 2));
var today = new Date();
var age = today.getFullYear() - year;
if (today.getMonth() < month || (today.getMonth() == month && today.getDate() < day)) {
  age--;
}
alert(age);


Xin lưu ý định dạng của bạn, đừng làm theo cách bạn đã làm; chỉ cần thụt mã của bạn với 4 khoảng trắng bằng nút mã (010101) hoặc Ctrl-K.
Marcel Korpel

Tôi đã làm nhưng nó không hoạt động trên IE9 Beta nên tôi phải làm bằng tay.
Francisc

4
Giải pháp ban đầu của bạn là tốt hơn, tính toán tuổi, hơn các câu trả lời hiện tại. Câu trả lời của Júlio Santos về cơ bản là giống nhau. Các câu trả lời khác cho kết quả không chính xác trong nhiều điều kiện và có thể kém đơn giản hơn hoặc kém hiệu quả hơn.
Brock Adams

Cảm ơn bạn Brock. Tôi đã hy vọng có một cách làm thanh lịch hơn để làm điều này hơn là có vẻ hơi thô.
Francisc

4
@Francisc, thật thô thiển, nhưng đó là những gì Dateđối tượng sẽ phải làm nếu nó gói gọn nó. Mọi người có thể viết sách về sự hấp dẫn trong cách Datexử lý của JS . ... Nếu bạn có thể sống với đôi khi được nghỉ một ngày, thì phép tính gần đúng: AgeInYears = Math.floor ( (now_Date - DOB_Date) / 31556952000 )đơn giản như bạn có thể nhận được.
Brock Adams

Câu trả lời:


245

Tôi sẽ đọc cho dễ đọc:

function _calculateAge(birthday) { // birthday is a date
    var ageDifMs = Date.now() - birthday.getTime();
    var ageDate = new Date(ageDifMs); // miliseconds from epoch
    return Math.abs(ageDate.getUTCFullYear() - 1970);
}

Tuyên bố từ chối trách nhiệm: Điều này cũng có vấn đề chính xác, vì vậy điều này cũng không thể được tin tưởng hoàn toàn. Nó có thể tắt sau vài giờ, trong một số năm hoặc trong khi tiết kiệm ánh sáng ban ngày (tùy thuộc vào múi giờ).

Thay vào đó tôi sẽ khuyên bạn nên sử dụng một thư viện cho việc này, nếu độ chính xác là rất quan trọng. Ngoài ra @Naveens post, có lẽ là chính xác nhất, vì nó không phụ thuộc vào thời gian trong ngày.


Điểm chuẩn: http://jsperf.com/b birthday-calculation/15


3
Điều này trả về 0 năm cho các ngày như 2000-02-29 đến 2001 / 02-28 khi nó có thể sẽ quay lại 1.
RobG

16
@RobG Tôi không nghĩ rằng một năm về mặt kỹ thuật đã trôi qua từ 2000-02-29 đến 2001 / 02-28, khiến câu trả lời của bạn không hợp lệ. Sẽ không có ý nghĩa gì, 2000-02-28 đến 2001-02-28 là một năm, vì vậy 2000-02-29 đến 2001-02-28, phải ít hơn một năm.
André Snede Kock

3
Bạn đã không nói chi tiết "không chính xác" nghĩa là gì, tôi nghĩ thông tin bổ sung có thể hữu ích. Bạn có thể xem xét sửa chữa các vấn đề hoặc xóa câu trả lời.
RobG

1
@RobG Thật ra tôi đã làm. Tôi cũng chỉ ra một giải pháp tốt hơn của tôi. Giải pháp của tôi giải quyết vấn đề theo cách dễ đọc, với các vấn đề chính xác nhỏ, nhưng trong giới hạn của mục đích của nó.
André Snede Kock

1
Câu trả lời đáng yêu @ AndréSnedeHansen và cũng nhanh, vì bạn không có sự phân chia điên rồ như trong câu trả lời của tôi ;-) +1 cho khả năng đọc và tốc độ.
Kristoffer Dorph

506

Thử cái này.

function getAge(dateString) {
    var today = new Date();
    var birthDate = new Date(dateString);
    var age = today.getFullYear() - birthDate.getFullYear();
    var m = today.getMonth() - birthDate.getMonth();
    if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
        age--;
    }
    return age;
}

Tôi tin rằng điều duy nhất có vẻ thô thiển trong mã của bạn là substrmột phần.

Câu đố : http://jsfiddle.net/codeandcloud/n33RJ/


Bạn có thể đưa ra một ví dụ sử dụng? Tôi không thể làm cho nó hoạt động mà không sửa đổi hàm để có 3 đối số riêng biệt, chẳng hạn như: getAge (y, m, d). Ví dụ: jsbin.com/ehaqiw/1/edit
edt

Giống như nhiều người khác, điều này nghĩ rằng 2000-02-29 đến 2001-02-28 là 0 năm, khi đó nhiều khả năng là 1 (kể từ 2001 / 03-01 nên là 1 năm 1 ngày).
RobG

3
@RobG: khi tờ rơi 'ăn mừng' (câu trả lời chung cho câu hỏi đó dường như thực sự là: 'cuối tuần gần nhất với ngày thực tế') ngày sinh của họ khác nhau dựa trên ngữ cảnh bao gồm: vùng địa lý (tiếng Anh đơn giản: nơi bạn sống ), LUẬT (không đánh giá thấp điều đó), tôn giáo và sở thích cá nhân (bao gồm cả hành vi nhóm): Một số lý do: "Tôi sinh vào tháng Hai", lý do khác: "Tôi sinh vào ngày sau ngày 28 tháng 2" (thường là ngày 1 tháng 3) en.wikipedia.org/wiki/F/2_29 Với tất cả những điều trên, điều này là chính xác NẾU ngày 1 tháng 3 là kết quả
nhảy vọt mà

3
@RobG: Sự chấm dứt của 'cộng x tháng (s)' không liên quan đến quan niệm của con người về tuổi tác trong nhiều năm. Quan niệm phổ biến của con người là số tuổi (InYears) tăng lên mỗi ngày (không tính đến thời gian) khi lịch có cùng tháng # và ngày # (so với ngày bắt đầu): sao cho 2000 / 02-28 đến 2001/02 -27 = 0 năm và 2000-02-28 đến 2001-02-28 = 1 năm. Mở rộng 'ý thức chung' đó đến các tờ rơi: 2000-02-29 (ngày sau 2000-02-28) đến 2001-02-28 = 0 năm . Nhận xét của tôi chỉ đơn thuần nói rằng thuật toán trả lời luôn đưa ra câu trả lời 'chính xác' của con người NẾU người ta mong đợi / đồng ý với logic này cho các tờ rơi.
GitaarLAB 17/03/2016

3
@RobG: Tôi chưa bao giờ nói tôi hoặc câu trả lời là hoàn toàn chính xác (TM). Tôi bao gồm khái niệm về bối cảnh / khu vực pháp lý / quan điểm. Cả hai ý kiến ​​của tôi rõ ràng bao gồm một chữ hoa IF (hướng tới việc xử lý các tờ rơi ngoại lệ). Trên thực tế, bình luận đầu tiên của tôi đã nêu chính xác những gì tôi muốn nói và không bao giờ đưa ra bất kỳ phán xét nào liên quan đến đúng hay sai. Trong thực tế, ý kiến ​​của tôi làm rõ những gì và những gì không mong đợi (và tại sao) từ câu trả lời này (như bạn gọi nó là 'làm nổi bật các vấn đề'). Ps: 31 tháng 2?!?
GitaarLAB 17/03/2016

72

Quan trọng: Câu trả lời này không cung cấp câu trả lời chính xác 100%, câu trả lời sẽ tắt trong khoảng 10-20 giờ tùy thuộc vào ngày.

Không có giải pháp nào tốt hơn (dù sao trong những câu trả lời này). - gian giữa

Tất nhiên tôi không thể cưỡng lại sự thôi thúc muốn vượt qua thử thách và tạo ra một máy tính sinh nhật nhanh hơn và ngắn hơn so với giải pháp được chấp nhận hiện tại. Điểm chính cho giải pháp của tôi là toán học rất nhanh, vì vậy thay vì sử dụng phân nhánh và mô hình ngày javascript cung cấp để tính toán một giải pháp chúng tôi sử dụng toán học tuyệt vời

Câu trả lời giống như thế này và chạy nhanh hơn ~ 65% so với naveen cộng với nó ngắn hơn nhiều:

function calcAge(dateString) {
  var birthday = +new Date(dateString);
  return ~~((Date.now() - birthday) / (31557600000));
}

Số ma thuật: 31557600000 là 24 * 3600 * 365,25 * 1000 Đó là độ dài của một năm, độ dài của một năm là 365 ngày và 6 giờ là 0,25 ngày. Cuối cùng, tôi đạt được kết quả cuối cùng.

Dưới đây là điểm chuẩn: http://jsperf.com/b birthday-calculation

Để hỗ trợ định dạng dữ liệu của OP, bạn có thể thay thế +new Date(dateString);
bằng+new Date(d.substr(0, 4), d.substr(4, 2)-1, d.substr(6, 2));

Nếu bạn có thể đưa ra một giải pháp tốt hơn xin vui lòng chia sẻ! :-)


Đó là một giải pháp khá tuyệt vời. Vấn đề duy nhất tôi thấy với nó là dateStringđối số vừa phải để hàm tạo Date () phân tích chính xác. Ví dụ, lấy YYYYMMDDđịnh dạng tôi đưa ra trong câu hỏi, nó sẽ thất bại.
Francisc

22
Câu trả lời này có một lỗi trong đó. Đặt đồng hồ của bạn thành 12:01 sáng. Vào lúc 12:01 sáng, nếu bạn calcAge ('2012 / 03-27') (ngày hôm nay), bạn sẽ nhận được câu trả lời bằng 0, mặc dù nó phải bằng 1. Lỗi này tồn tại trong toàn bộ 12:00 giờ. Điều này là do tuyên bố không chính xác rằng một năm có 365,25 ngày trong đó. Nó không. Chúng tôi đang xử lý các năm theo lịch chứ không phải chiều dài quỹ đạo của Trái đất (chính xác hơn là 365.256363 ngày). Một năm có 365 ngày, ngoại trừ một năm nhuận có 365 ngày. Bên cạnh đó, hiệu suất trên một cái gì đó như thế này là vô nghĩa. Bảo trì là quan trọng hơn nhiều.
Eric Brandel

1
Cảm ơn giải pháp của bạn, Kristoffer. Tôi có thể hỏi những gì + mới làm so với chỉ mới và cả hai dấu ngã (~) khi trả lại không?
Frank Jensen

1
@FrankJensen Chào Frank, tôi cũng tò mò và tìm thấy câu trả lời này: dấu ngã kép chuyển đổi thành số nguyên Lời chào
Stano

1
@FrankJensen về cơ bản là dấu ngã đảo ngược số (giá trị nhị phân) trong khi chuyển đổi float thành số nguyên (thả nổi), do đó, hai dấu ngã cung cấp cho bạn số làm tròn. Dấu + phía trước Ngày mới () chuyển đổi đối tượng thành biểu diễn số nguyên của đối tượng ngày, điều này cũng có thể được sử dụng với các chuỗi số chẳng hạn + '21 '=== 21
Kristoffer Dorph

55

Với khoảnh khắc:

/* The difference, in years, between NOW and 2012-05-07 */
moment().diff(moment('20120507', 'YYYYMMDD'), 'years')

2
@RicardoPontual điều này đòi hỏi khoảnh khắc, vì vậy không thể là câu trả lời tốt nhất.
itzmukeshy7

13
@ itzmukeshy7 thực sự, để một câu trả lời là tốt nhất, ít nhất nó cần phải có jQuery;)
thomaux

@thomaux Nó hoàn toàn phụ thuộc vào môi trường phát triển!
itzmukeshy7

@ itzmukeshy7 thư giãn, đó là một trò đùa;) xem: meta.stackexchange.com/a/19492/173875
thomaux

2
@thomaux Tôi biết đó là một trò đùa;)
itzmukeshy7

38

Làm sạch dung dịch một lớp lót bằng ES6:

const getAge = birthDate => Math.floor((new Date() - new Date(birthDate).getTime()) / 3.15576e+10)

// today is 2018-06-13
getAge('1994-06-14') // 23
getAge('1994-06-13') // 24

Tôi đang sử dụng một năm 365,25 ngày (0,25 vì năm nhuận) tương ứng là 3.15576e + 10 mili giây (365,25 * 24 * 60 * 60 * 1000).


1
Khá gọn gàng - bạn có thể giải thích 3.15576e + 10 nghĩa là gì không?
leo núi

1
Có, sẽ tốt hơn nếu thêm dòng sau vào chức năng:const yearInMs = 3.15576e+10 // Using a year of 365.25 days (because leap years)
Lucas Janon

12

Thời gian trước tôi đã thực hiện một chức năng với mục đích đó:

function getAge(birthDate) {
  var now = new Date();

  function isLeap(year) {
    return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
  }

  // days since the birthdate    
  var days = Math.floor((now.getTime() - birthDate.getTime())/1000/60/60/24);
  var age = 0;
  // iterate the years
  for (var y = birthDate.getFullYear(); y <= now.getFullYear(); y++){
    var daysInYear = isLeap(y) ? 366 : 365;
    if (days >= daysInYear){
      days -= daysInYear;
      age++;
      // increment the age only if there are available enough days for the year.
    }
  }
  return age;
}

Nó lấy một đối tượng Date làm đầu vào, vì vậy bạn cần phân tích 'YYYYMMDD'chuỗi ngày được định dạng:

var birthDateStr = '19840831',
    parts = birthDateStr.match(/(\d{4})(\d{2})(\d{2})/),
    dateObj = new Date(parts[1], parts[2]-1, parts[3]); // months 0-based!

getAge(dateObj); // 26

À đúng rồi, tôi đã bỏ lỡ năm nhuận. Cảm ơn bạn.
Francisc

1
Điều này mang lại giá trị không hợp lệ cho các kết hợp ngày được chọn! Ví dụ: nếu birthDatengày 5 tháng 1 năm 1980 và ngày hiện tại là ngày 4 tháng 1 năm 2005 thì hàm sẽ báo cáo sai agelà 25 ... Giá trị đúng là 24.
Brock Adams

@BrockAdams Tại sao lại thế này? Tôi đang gặp vấn đề này vào lúc này. Cảm ơn.
Jack H

@VisionIncision, vì nó không xử lý các điều kiện cạnh đúng cách. Dù bạn có tin hay không, mã từ câu hỏi là cách tiếp cận tốt nhất - mặc dù có vẻ như một trong những câu trả lời sau này có thể đã đóng gói lại một cách phù hợp hơn.
Brock Adams

CMS Hi :-) Tôi đã viết câu hỏi này ( stackoverflow.com/questions/16435981/, ) và tôi được cho biết rằng nếu tôi muốn câu trả lời chính xác 100% tôi nên kiểm tra hàng năm - nếu đó là năm nhuận, và sau đó là lần cuối phân số. (xem câu trả lời của Guffa). Chức năng của bạn (một phần của nó) làm điều đó . nhưng làm thế nào tôi có thể sử dụng nó để tính tuổi chính xác 100%? DOB hiếm khi bắt đầu với tỷ lệ 1/1 / yyyy ..... vậy làm thế nào tôi có thể sử dụng chức năng của mình để tính tuổi chính xác?
Royi Namir

10

Đây là giải pháp của tôi, chỉ cần vượt qua trong một ngày có thể phân tích cú pháp:

function getAge(birth) {
  ageMS = Date.parse(Date()) - Date.parse(birth);
  age = new Date();
  age.setTime(ageMS);
  ageYear = age.getFullYear() - 1970;

  return ageYear;

  // ageMonth = age.getMonth(); // Accurate calculation of the month part of the age
  // ageDay = age.getDate();    // Approximate calculation of the day part of the age
}

7

Giải pháp thay thế, vì tại sao không:

function calculateAgeInYears (date) {
    var now = new Date();
    var current_year = now.getFullYear();
    var year_diff = current_year - date.getFullYear();
    var birthday_this_year = new Date(current_year, date.getMonth(), date.getDate());
    var has_had_birthday_this_year = (now >= birthday_this_year);

    return has_had_birthday_this_year
        ? year_diff
        : year_diff - 1;
}

5
function age()
{
    var birthdate = $j('#birthDate').val(); // in   "mm/dd/yyyy" format
    var senddate = $j('#expireDate').val(); // in   "mm/dd/yyyy" format
    var x = birthdate.split("/");    
    var y = senddate.split("/");
    var bdays = x[1];
    var bmonths = x[0];
    var byear = x[2];
    //alert(bdays);
    var sdays = y[1];
    var smonths = y[0];
    var syear = y[2];
    //alert(sdays);

    if(sdays < bdays)
    {
        sdays = parseInt(sdays) + 30;
        smonths = parseInt(smonths) - 1;
        //alert(sdays);
        var fdays = sdays - bdays;
        //alert(fdays);
    }
    else{
        var fdays = sdays - bdays;
    }

    if(smonths < bmonths)
    {
        smonths = parseInt(smonths) + 12;
        syear = syear - 1;
        var fmonths = smonths - bmonths;
    }
    else
    {
        var fmonths = smonths - bmonths;
    }

    var fyear = syear - byear;
    document.getElementById('patientAge').value = fyear+' years '+fmonths+' months '+fdays+' days';
}

Cảm ơn dễ dàng tìm thấy tuổi trong năm tháng và ngày
Sumit Kumar Gupta

5

Để kiểm tra xem ngày sinh đã trôi qua hay chưa, tôi xác định hàm trợ giúp Date.prototype.getDoY, có hiệu quả trả về số ngày trong năm. Phần còn lại là khá tự giải thích.

Date.prototype.getDoY = function() {
    var onejan = new Date(this.getFullYear(), 0, 1);
    return Math.floor(((this - onejan) / 86400000) + 1);
};

function getAge(birthDate) {
    function isLeap(year) {
        return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
    }

    var now = new Date(),
        age = now.getFullYear() - birthDate.getFullYear(),
        doyNow = now.getDoY(),
        doyBirth = birthDate.getDoY();

    // normalize day-of-year in leap years
    if (isLeap(now.getFullYear()) && doyNow > 58 && doyBirth > 59)
        doyNow--;

    if (isLeap(birthDate.getFullYear()) && doyNow > 58 && doyBirth > 59)
        doyBirth--;

    if (doyNow <= doyBirth)
        age--;  // birthday not yet passed this year, so -1

    return age;
};

var myBirth = new Date(2001, 6, 4);
console.log(getAge(myBirth));

Điều này cho kết quả không chính xác trong năm nhuận, cho ngày sinh sau ngày 28 tháng 2. Nó tuổi những người như vậy 1 ngày. EG: cho DoB = 2001/07/04 , chức năng này sẽ trở lại 7 năm, vào 2008/07/03 .
Brock Adams

@Brock: Cảm ơn. Nếu tôi không nhầm, tôi đã sửa chữa hành vi sai lầm này.
Marcel Korpel

Vâng, tôi nghĩ rằng bạn có thể đã (chưa được kiểm tra nghiêm ngặt, chỉ phân tích). Nhưng, lưu ý rằng giải pháp mới không đơn giản và thanh lịch hơn giải pháp của OP (không tính rằng giải pháp này được gói gọn trong một chức năng). ... Giải pháp của OP dễ hiểu hơn (do đó để kiểm toán, kiểm tra hoặc sửa đổi). Đôi khi đơn giản và dễ hiểu là tốt nhất, IMO.
Brock Adams

@Brock: Tôi hoàn toàn đồng ý: Tôi phải suy nghĩ về chức năng này làm gì và đó không bao giờ là một điều tốt.
Marcel Korpel

Không nên "if (doyNow <doyBirth)" là "if (doyNow <= doyBirth)"? Trong tất cả các bài kiểm tra của tôi, ngày đã bị tắt bởi một người và điều đó đã sửa nó.
Ted Kulp

5

Tôi nghĩ rằng có thể chỉ đơn giản như thế:

function age(dateString){
    let birth = new Date(dateString);
    let now = new Date();
    let beforeBirth = ((() => {birth.setDate(now.getDate());birth.setMonth(now.getMonth()); return birth.getTime()})() < birth.getTime()) ? 0 : 1;
    return now.getFullYear() - birth.getFullYear() - beforeBirth;
}

age('09/20/1981');
//35

Hoạt động với dấu thời gian

age(403501000000)
//34

Mã này sẽ tính toán một người có cùng độ tuổi cả năm. Trong ví dụ của bạn, nếu hôm nay là '09 / 19/2018 ', mã sẽ cho 37, nhưng tuổi (ngày trước ngày sinh nhật) sẽ là 36 ...
Steve Goossens

4

Tôi chỉ phải tự viết chức năng này - câu trả lời được chấp nhận là khá tốt nhưng IMO có thể sử dụng một số dọn dẹp. Điều này cần một dấu thời gian unix cho dob vì đó là yêu cầu của tôi nhưng có thể được điều chỉnh nhanh chóng để sử dụng chuỗi:

var getAge = function(dob) {
    var measureDays = function(dateObj) {
            return 31*dateObj.getMonth()+dateObj.getDate();
        },
        d = new Date(dob*1000),
        now = new Date();

    return now.getFullYear() - d.getFullYear() - (measureDays(now) < measureDays(d));
}

Lưu ý rằng tôi đã sử dụng giá trị cố định là 31 trong hàm số đoDays của mình. Tất cả các tính toán quan tâm là "ngày của năm" là một thước đo tăng đơn điệu của dấu thời gian.

Nếu sử dụng dấu thời gian hoặc chuỗi javascript, rõ ràng bạn sẽ muốn xóa hệ số 1000.


n không xác định. Tôi nghĩ bạn có nghĩa là ngay bây giờ.getFullYear ()
Larry Battle

4
function getAge(dateString) {

    var dates = dateString.split("-");
    var d = new Date();

    var userday = dates[0];
    var usermonth = dates[1];
    var useryear = dates[2];

    var curday = d.getDate();
    var curmonth = d.getMonth()+1;
    var curyear = d.getFullYear();

    var age = curyear - useryear;

    if((curmonth < usermonth) || ( (curmonth == usermonth) && curday < userday   )){

        age--;

    }

    return age;
}

Để có được tuổi khi ngày châu Âu đã bước vào:

getAge('16-03-1989')

Cảm ơn lời đề nghị của bạn tại stackoverflow.com/a/13367162/1055987 bắt tốt.
JFK

3

Một giải pháp khả thi hơn với khoảnh khắc.js :

var moment = require('moment');
var startDate = new Date();
var endDate = new Date();
endDate.setDate(endDate.getFullYear() + 5); // Add 5 years to second date
console.log(moment.duration(endDate - startDate).years()); // This should returns 5

2

Tôi đã kiểm tra các ví dụ hiển thị trước đó và chúng không hoạt động trong mọi trường hợp và vì điều này tôi đã tạo ra một kịch bản của riêng mình. Tôi đã thử nghiệm điều này, và nó hoạt động hoàn hảo.

function getAge(birth) {
   var today = new Date();
   var curr_date = today.getDate();
   var curr_month = today.getMonth() + 1;
   var curr_year = today.getFullYear();

   var pieces = birth.split('/');
   var birth_date = pieces[0];
   var birth_month = pieces[1];
   var birth_year = pieces[2];

   if (curr_month == birth_month && curr_date >= birth_date) return parseInt(curr_year-birth_year);
   if (curr_month == birth_month && curr_date < birth_date) return parseInt(curr_year-birth_year-1);
   if (curr_month > birth_month) return parseInt(curr_year-birth_year);
   if (curr_month < birth_month) return parseInt(curr_year-birth_year-1);
}

var age = getAge('18/01/2011');
alert(age);

2000-02-29 đến 2001 / 02-28 nên là một năm? Nếu vậy, thì ở trên không hoàn hảo. :-)
RobG

2

Đó là cách thanh lịch nhất đối với tôi:

const getAge = (birthDateString) => {
  const today = new Date();
  const birthDate = new Date(birthDateString);

  const yearsDifference = today.getFullYear() - birthDate.getFullYear();

  if (
    today.getMonth() < birthDate.getMonth() ||
    (today.getMonth() === birthDate.getMonth() && today.getDate() < birthDate.getDate())
  ) {
    return yearsDifference - 1;
  }

  return yearsDifference;
};

console.log(getAge('2018-03-12'));


1

Lấy tuổi (năm, tháng và ngày) kể từ ngày sinh bằng javascript

Chức năng calcularEdad (năm, tháng và ngày)

function calcularEdad(fecha) {
        // Si la fecha es correcta, calculamos la edad

        if (typeof fecha != "string" && fecha && esNumero(fecha.getTime())) {
            fecha = formatDate(fecha, "yyyy-MM-dd");
        }

        var values = fecha.split("-");
        var dia = values[2];
        var mes = values[1];
        var ano = values[0];

        // cogemos los valores actuales
        var fecha_hoy = new Date();
        var ahora_ano = fecha_hoy.getYear();
        var ahora_mes = fecha_hoy.getMonth() + 1;
        var ahora_dia = fecha_hoy.getDate();

        // realizamos el calculo
        var edad = (ahora_ano + 1900) - ano;
        if (ahora_mes < mes) {
            edad--;
        }
        if ((mes == ahora_mes) && (ahora_dia < dia)) {
            edad--;
        }
        if (edad > 1900) {
            edad -= 1900;
        }

        // calculamos los meses
        var meses = 0;

        if (ahora_mes > mes && dia > ahora_dia)
            meses = ahora_mes - mes - 1;
        else if (ahora_mes > mes)
            meses = ahora_mes - mes
        if (ahora_mes < mes && dia < ahora_dia)
            meses = 12 - (mes - ahora_mes);
        else if (ahora_mes < mes)
            meses = 12 - (mes - ahora_mes + 1);
        if (ahora_mes == mes && dia > ahora_dia)
            meses = 11;

        // calculamos los dias
        var dias = 0;
        if (ahora_dia > dia)
            dias = ahora_dia - dia;
        if (ahora_dia < dia) {
            ultimoDiaMes = new Date(ahora_ano, ahora_mes - 1, 0);
            dias = ultimoDiaMes.getDate() - (dia - ahora_dia);
        }

        return edad + " años, " + meses + " meses y " + dias + " días";
    }

Chức năng esNumero

function esNumero(strNumber) {
    if (strNumber == null) return false;
    if (strNumber == undefined) return false;
    if (typeof strNumber === "number" && !isNaN(strNumber)) return true;
    if (strNumber == "") return false;
    if (strNumber === "") return false;
    var psInt, psFloat;
    psInt = parseInt(strNumber);
    psFloat = parseFloat(strNumber);
    return !isNaN(strNumber) && !isNaN(psFloat);
}

1

Làm việc hoàn hảo cho tôi, các bạn.

getAge(birthday) {
    const millis = Date.now() - Date.parse(birthday);
    return new Date(millis).getFullYear() - 1970;
}

0

Tôi biết đây là một chủ đề rất cũ nhưng tôi muốn đưa vào triển khai này mà tôi đã viết để tìm ra độ tuổi mà tôi tin là chính xác hơn nhiều.

var getAge = function(year,month,date){
    var today = new Date();
    var dob = new Date();
    dob.setFullYear(year);
    dob.setMonth(month-1);
    dob.setDate(date);
    var timeDiff = today.valueOf() - dob.valueOf();
    var milliInDay = 24*60*60*1000;
    var noOfDays = timeDiff / milliInDay;
    var daysInYear = 365.242;
    return  ( noOfDays / daysInYear ) ;
}

Tất nhiên, bạn có thể điều chỉnh nó để phù hợp với các định dạng khác của việc lấy các tham số. Hy vọng điều này sẽ giúp ai đó tìm kiếm một giải pháp tốt hơn.


0

Tôi đã sử dụng phương pháp này bằng cách sử dụng logic thay vì toán học. Nó chính xác và nhanh chóng. Các thông số là năm, tháng và ngày sinh nhật của người đó. Nó trả về tuổi của một người như một số nguyên.

function calculateAge(year, month, day) {
        var currentDate = new Date();
        var currentYear = currentDate.getFullYear();
        var currentMonth = currentDate.getUTCMonth() + 1;
        var currentDay = currentDate.getUTCDate();
        // You need to treat the cases where the year, month or day hasn't arrived yet.
        var age = currentYear - year;
        if (currentMonth > month) {
            return age;
        } else {
            if (currentDay >= day) {
                return age;
            } else {
                age--;
                return age;
            }
        }
    }

chuỗi hoặc đối tượng ngày cho đầu vào theo OP
nazim

0

Thông qua các bài đăng của OP ban đầu và OP ban đầu, tôi đã kết thúc với một phương thức có thể sử dụng lại, chấp nhận cả hai chuỗi và / hoặc các đối tượng Ngày JS.

Tôi đặt tên cho nó gregorianAge()bởi vì tính toán này đưa ra chính xác cách chúng ta biểu thị tuổi bằng cách sử dụng lịch Gregorian. tức là không tính năm kết thúc nếu tháng và ngày là trước tháng và ngày của năm sinh.

/**
 * Calculates human age in years given a birth day. Optionally ageAtDate
 * can be provided to calculate age at a specific date
 *
 * @param string|Date Object birthDate
 * @param string|Date Object ageAtDate optional
 * @returns integer Age between birthday and a given date or today
 */
function gregorianAge(birthDate, ageAtDate) {
  // convert birthDate to date object if already not
  if (Object.prototype.toString.call(birthDate) !== '[object Date]')
    birthDate = new Date(birthDate);

  // use today's date if ageAtDate is not provided
  if (typeof ageAtDate == "undefined")
    ageAtDate = new Date();

  // convert ageAtDate to date object if already not
  else if (Object.prototype.toString.call(ageAtDate) !== '[object Date]')
    ageAtDate = new Date(ageAtDate);

  // if conversion to date object fails return null
  if (ageAtDate == null || birthDate == null)
    return null;


  var _m = ageAtDate.getMonth() - birthDate.getMonth();

  // answer: ageAt year minus birth year less one (1) if month and day of
  // ageAt year is before month and day of birth year
  return (ageAtDate.getFullYear()) - birthDate.getFullYear() 
  - ((_m < 0 || (_m === 0 && ageAtDate.getDate() < birthDate.getDate())) ? 1 : 0)
}

// Below is for the attached snippet

function showAge() {
  $('#age').text(gregorianAge($('#dob').val()))
}

$(function() {
  $(".datepicker").datepicker();
  showAge();
});
<link rel="stylesheet" href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
<script src="//code.jquery.com/jquery-1.10.2.js"></script>
<script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>

DOB:
<input name="dob" value="12/31/1970" id="dob" class="datepicker" onChange="showAge()" /> AGE: <span id="age"><span>


0

Hai lựa chọn khác:

// Int Age to Date as string YYY-mm-dd
function age_to_date(age)
{
    try {
        var d = new Date();
        var new_d = '';
        d.setFullYear(d.getFullYear() - Math.abs(age));
        new_d = d.getFullYear() + '-' + d.getMonth() + '-' + d.getDate();

        return new_d;
    } catch(err) {
        console.log(err.message);
    }
}
// Date string (YYY-mm-dd) to Int age (years old)
function date_to_age(date)
{
    try {
        var today = new Date();
        var d = new Date(date);

        var year = today.getFullYear() - d.getFullYear();
        var month = today.getMonth() - d.getMonth();
        var day = today.getDate() - d.getDate();
        var carry = 0;

        if (year < 0)
            return 0;
        if (month <= 0 && day <= 0)
            carry -= 1;

        var age = parseInt(year);
        age += carry;

        return Math.abs(age);
    } catch(err) {
        console.log(err.message);
    }
}

0

Tôi đã thực hiện một số cập nhật cho một câu trả lời trước đó.

var calculateAge = function(dob) {
    var days = function(date) {
            return 31*date.getMonth() + date.getDate();
        },
        d = new Date(dob*1000),
        now = new Date();

    return now.getFullYear() - d.getFullYear() - ( measureDays(now) < measureDays(d));
}

Tôi hy vọng điều đó sẽ giúp: D


0

Đây là một cách tính tuổi đơn giản:

//dob date dd/mm/yy 
var d = 01/01/1990


//today
//date today string format 
var today = new Date(); // i.e wed 04 may 2016 15:12:09 GMT
//todays year
var todayYear = today.getFullYear();
// today month
var todayMonth = today.getMonth();
//today date
var todayDate = today.getDate();

//dob
//dob parsed as date format   
var dob = new Date(d);
// dob year
var dobYear = dob.getFullYear();
// dob month
var dobMonth = dob.getMonth();
//dob date
var dobDate = dob.getDate();

var yearsDiff = todayYear - dobYear ;
var age;

if ( todayMonth < dobMonth ) 
 { 
  age = yearsDiff - 1; 
 }
else if ( todayMonth > dobMonth ) 
 {
  age = yearsDiff ; 
 }

else //if today month = dob month
 { if ( todayDate < dobDate ) 
  {
   age = yearsDiff - 1;
  }
    else 
    {
     age = yearsDiff;
    }
 }

0
var now = DateTime.Now;
var age = DateTime.Now.Year - dob.Year;
if (now.Month < dob.Month || now.Month == dob.Month && now.Day < dob.Day) age--;

Nó làm một sự khác biệt năm đơn giản giữa bây giờ và năm sinh. Sau đó, nó trừ đi một năm nếu hôm nay sớm hơn năm sinh nhật (hãy nghĩ về nó, tuổi của bạn tăng lên trong năm, vào ngày sinh nhật của bạn)
Steve Goossens

0

Bạn có thể sử dụng điều này để hạn chế độ tuổi trong mẫu của bạn -

function dobvalidator(birthDateString){
    strs = birthDateString.split("-");
    var dd = strs[0];
    var mm = strs[1];
    var yy = strs[2];

    var d = new Date();
    var ds = d.getDate();
    var ms = d.getMonth();
    var ys = d.getFullYear();
    var accepted_age = 18;

    var days = ((accepted_age * 12) * 30) + (ms * 30) + ds;
    var age = (((ys - yy) * 12) * 30) + ((12 - mm) * 30) + parseInt(30 - dd);

    if((days - age) <= '0'){
        console.log((days - age));
        alert('You are at-least ' + accepted_age);
    }else{
        console.log((days - age));
        alert('You are not at-least ' + accepted_age);
    }
}

0

Tôi hơi muộn nhưng tôi thấy đây là cách đơn giản nhất để tính ngày sinh.

$(document).ready(init);

function init()
{
  writeYears("myage", 0, Age());
  $(".captcha").click(function()
  {
    reloadCaptcha();
  });

}

function Age()
{
    var birthday = new Date(1997, 02, 01),  //Year, month, day.
        today = new Date(),
        one_year = 1000*60*60*24*365;
    return Math.floor( (today.getTime() - birthday.getTime() ) / one_year);
}

function writeYears(id, current, maximum)
{
  document.getElementById(id).innerHTML = current;

  if (current < maximum)
  {
    setTimeout( function() { writeYears(id, ++current, maximum); }, Math.sin( current/maximum ) * 200 );
    }
}

Thẻ HTML:

<span id="myage"></span>

Hy vọng điều này sẽ giúp.


-1

Đây là giải pháp đơn giản, chính xác nhất mà tôi có thể đưa ra:

Date.prototype.getAge = function (date) {
    if (!date) date = new Date();
    return ~~((date.getFullYear() + date.getMonth() / 100
    + date.getDate() / 10000) - (this.getFullYear() + 
    this.getMonth() / 100 + this.getDate() / 10000));
}

Và đây là một mẫu sẽ xem xét ngày 29 tháng 2 -> 28 tháng 2 một năm.

Date.prototype.getAge = function (date) {
    if (!date) date = new Date();
    var feb = (date.getMonth() == 1 || this.getMonth() == 1);
    return ~~((date.getFullYear() + date.getMonth() / 100 + 
        (feb && date.getDate() == 29 ? 28 : date.getDate())
        / 10000) - (this.getFullYear() + this.getMonth() / 100 + 
        (feb && this.getDate() == 29 ? 28 : this.getDate()) 
        / 10000));
}

Nó thậm chí hoạt động với tuổi tiêu cực!


Giống như tất cả những người khác, nó nghĩ rằng 2000-02-29 đến 2001-02-28 là 0 năm.
RobG

Tôi đã cập nhật câu trả lời của mình để phù hợp với trường hợp năm nhuận. Cảm ơn @RobG
wizulus

-1

Một giải pháp khác:

/**
 * Calculate age by birth date.
 *
 * @param int birthYear Year as YYYY.
 * @param int birthMonth Month as number from 1 to 12.
 * @param int birthDay Day as number from 1 to 31.
 * @return int
 */
function getAge(birthYear, birthMonth, birthDay) {
  var today = new Date();
  var birthDate = new Date(birthYear, birthMonth-1, birthDay);
  var age = today.getFullYear() - birthDate.getFullYear();
  var m = today.getMonth() - birthDate.getMonth();
  if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
    age--;
  }
  return age;
}

-1

Với momentjs phương pháp "fromNow", Điều này cho phép bạn làm việc với các định dạng ngày, ví dụ: 1968/03/15

var dob = document.getElementByID("dob"); var age = moment(dob.value).fromNow(true).replace(" years", "");

//fromNow(true) => suffix "ago" is not displayed //but we still have to get rid of "years";

Là phiên bản nguyên mẫu

String.prototype.getAge = function() {
return moment(this.valueOf()).fromNow(true).replace(" years", "");

}

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.