คำนวณอายุที่ให้วันเกิดในรูปแบบ YYYYMMDD


285

ฉันจะคำนวณอายุเป็นปีได้อย่างไรโดยกำหนดวันเกิดในรูปแบบ YYYYMMMM มันเป็นไปได้โดยใช้Date()ฟังก์ชั่น?

ฉันกำลังมองหาทางออกที่ดีกว่าที่ฉันใช้อยู่ตอนนี้:

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


โปรดคำนึงถึงการจัดรูปแบบของคุณอย่าทำอย่างที่คุณทำ เพียงเยื้องรหัสของคุณมี 4 พื้นที่โดยใช้รหัส (010,101) ปุ่มหรือ Ctrl-K
Marcel Korpel

ฉันทำ แต่มันล้มเหลวในการทำงานกับ IE9 Beta ดังนั้นฉันต้องทำด้วยมือ
Francisc

4
โซลูชันดั้งเดิมของคุณดีกว่าเมื่อคำนวณอายุกว่าคำตอบปัจจุบัน คำตอบJúlio Santos เป็นสิ่งเดียวกัน คำตอบอื่น ๆ ให้ผลลัพธ์ที่ไม่ถูกต้องภายใต้เงื่อนไขต่าง ๆ และอาจตรงไปตรงมาหรือมีประสิทธิภาพน้อยลง
เบอร์ทรัมออบรีย์ Adams

ขอบคุณบร็อค ฉันหวังว่าจะมีวิธีที่ยอดเยี่ยมกว่าในการทำสิ่งนี้มากกว่าสิ่งที่ดูหยาบ
Francisc

4
@ Francisc มันเป็นน้ำมันดิบ แต่มันเป็นสิ่งที่Dateวัตถุจะต้องทำถ้ามันห่อหุ้มมัน ผู้คนสามารถเขียนหนังสือเกี่ยวกับการดูดซับของการDateจัดการของ JS ... หากคุณสามารถใช้ชีวิตกับบางครั้งการถูกปิดในวันนั้นการประมาณ: AgeInYears = Math.floor ( (now_Date - DOB_Date) / 31556952000 )เป็นเรื่องง่ายที่สุดเท่าที่จะทำได้
เบอร์ทรัมออบรีย์ Adams

คำตอบ:


245

ฉันจะไปอ่าน:

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

ข้อจำกัดความรับผิดชอบ:นี่เป็นปัญหาที่แม่นยำดังนั้นจึงไม่น่าเชื่อถืออย่างสมบูรณ์ สามารถปิดได้ในเวลาไม่กี่ชั่วโมงในบางปีหรือในช่วงเวลากลางวัน (ขึ้นอยู่กับเขตเวลา)

แต่ฉันขอแนะนำให้ใช้ห้องสมุดนี้ถ้าความแม่นยำมีความสำคัญมาก นอกจากนี้ยัง@Naveens postอาจจะเป็นที่ถูกต้องที่สุดที่มันไม่ได้ขึ้นอยู่กับช่วงเวลาของวัน


มาตรฐาน: http://jsperf.com/birthday-calculation/15


3
สิ่งนี้ส่งคืน 0 ปีสำหรับวันที่เช่น 2000-02-29 ถึง 2001-02-28 เมื่อมันน่าจะกลับมา 1
RobG

16
@RobG ฉันไม่คิดว่าทั้งปีทางเทคนิคได้ผ่านจาก 2000-02-29 ถึง 2001-02-28 ทำให้คำตอบของคุณไม่ถูกต้อง มันคงไม่สมเหตุสมผล 2000-02-28 ถึง 2001-02-28 เป็นปีดังนั้น 2000-02-29 ถึง 2001-02-28 ต้องน้อยกว่าหนึ่งปี
André Snede Kock

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

1
@RobG จริงผมไม่ได้ ฉันยังชี้ไปที่ทางออกที่ดีกว่าของฉันเอง โซลูชันของฉันแก้ปัญหาในรูปแบบที่อ่านง่ายมีปัญหาความแม่นยำเล็กน้อย แต่อยู่ในขอบเขตที่ต้องการ
André Snede Kock

1
คำตอบที่น่ารัก @ AndréSnedeHansenและเร็วเกินไปเนื่องจากคุณไม่มีแผนกที่บ้าคลั่งดังที่มีอยู่ในคำตอบของฉัน ;-) +1 สำหรับการอ่านและความเร็ว
Kristoffer Dorph

506

ลองสิ่งนี้

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;
}

ฉันเชื่อว่าสิ่งเดียวที่ดูหยาบในรหัสของคุณคือsubstrส่วนหนึ่ง

ซอ : http://jsfiddle.net/codeandcloud/n33RJ/


คุณสามารถยกตัวอย่างการใช้งานได้หรือไม่? ฉันไม่สามารถได้รับมันจะทำงานได้โดยไม่ต้องปรับเปลี่ยนฟังก์ชั่นที่จะใช้เวลา 3 ข้อโต้แย้งที่แยกต่างหากเช่น getAge (y, M, D) ตัวอย่างเช่น: jsbin.com/ehaqiw/1/edit
EDT

เช่นเดียวกับคนอื่น ๆ คิดว่าปี 2000-02-29 ถึง 2001-02-28 เป็นศูนย์ปีเมื่อมันน่าจะเป็น 1 มากที่สุด (ตั้งแต่ 2001-03-01 ควรเป็น 1 ปี 1 วัน)
RobG

3
@RobG: เมื่อ leaplings 'เฉลิมฉลอง' (คำตอบทั่วไปสำหรับคำถามนั้นดูเหมือนจะเป็นจริง: 'วันหยุดสุดสัปดาห์ที่ใกล้เคียงที่สุดกับวันที่เกิดขึ้นจริง') วันเกิดของพวกเขาแตกต่างกันไปตามบริบทรวมถึง: ภูมิภาคภูมิศาสตร์ (ภาษาอังกฤษง่าย ๆ : ) กฎหมาย (ไม่ประมาท) ศาสนาและความชอบส่วนตัว (รวมถึงพฤติกรรมกลุ่ม): เหตุผลบางประการ: "ฉันเกิดในเดือนกุมภาพันธ์", เหตุผลอื่น: "ฉันเกิดวันหลังจากวันที่ 28 กุมภาพันธ์" (ซึ่งเป็นปกติมากที่สุด 1 มีนาคม) en.wikipedia.org/wiki/Follow_29สำหรับทั้งหมดข้างต้นอัลโก้นี้ถูกต้องถ้า 1 มีนาคมเป็นผล leapyear หนึ่งต้องการ
GitaarLAB

3
@RobG: cesspit ของ 'plus x month (s)' ไม่เกี่ยวข้องกับความคิดของมนุษย์ในยุคหลายปี ความคิดของมนุษย์ที่พบบ่อยคือว่าอายุ (InYears) -counter เพิ่มขึ้นทุกวัน (เวลาโดยไม่คำนึงถึง) เมื่อปฏิทินมีเดือนเดียวกัน # และ # วัน (เมื่อเทียบกับการเริ่มต้นวันที่): เพื่อให้ 2000/02/28 เพื่อ 2001-02 -27 = 0 ปีและ 2000-02-28 ถึง 2001-02-28 = 1 ปี ขยายว่า 'สามัญสำนึก' เพื่อ leaplings: 2000/02/29 (วันหลังจาก 2000/02/28) เพื่อ 2001/02/28 = ศูนย์ปี ความคิดเห็นของฉันระบุเพียงว่าอัลโกที่ได้รับคำตอบจะให้คำตอบที่ถูกต้องของมนุษย์ถ้าใครคาดหวัง / เห็นด้วยกับตรรกะนี้สำหรับ leaplings
GitaarLAB

3
@ RobG: ฉันไม่เคยพูดว่าฉันหรือคำตอบนั้นถูกต้องสากล (TM) ฉันรวมแนวคิดเกี่ยวกับบริบท / เขตอำนาจศาล / มุมมอง ความคิดเห็นของฉันทั้งสองอย่างชัดเจนรวมถึงIFตัวพิมพ์ใหญ่(ที่มีต่อการจัดการไฟล์ยกเว้น) ในความเป็นจริงความคิดเห็นแรกของฉันระบุว่าสิ่งที่ฉันตั้งใจจะพูดและไม่รวมถึงการตัดสินใด ๆ เกี่ยวกับถูกหรือผิด ผลจากความคิดเห็นของฉันทำให้ชัดเจนว่าอะไรและอะไรที่ไม่คาดหวัง (และทำไม) จากคำตอบนี้ (ในขณะที่คุณเรียกว่า 'เน้นประเด็น') Ps: 31 กุมภาพันธ์?!?
GitaarLAB

72

สำคัญ: คำตอบนี้ไม่ได้ให้คำตอบที่ถูกต้อง 100% คำตอบนั้นถูกปิดประมาณ 10-20 ชั่วโมงขึ้นอยู่กับวันที่

ไม่มีวิธีแก้ปัญหาที่ดีกว่า (ไม่ใช่ในคำตอบเหล่านี้) - naveen

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

คำตอบมีลักษณะเช่นนี้และทำงานได้เร็วกว่าของ naveen ประมาณ 65% และสั้นกว่ามาก:

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

หมายเลขเวทย์มนตร์: 31557600000 คือ 24 * 3600 * 365.25 * 1000 ซึ่งเป็นความยาวของปีความยาวของปีคือ 365 วันและ 6 ชั่วโมงซึ่งเป็น 0.25 วัน ในท้ายที่สุดฉันชั้นผลซึ่งทำให้เราอายุสุดท้าย

นี่คือมาตรฐาน: http://jsperf.com/birthday-calculation

เพื่อรองรับรูปแบบข้อมูลของ OP คุณสามารถแทนที่+new Date(dateString);
ด้วย+new Date(d.substr(0, 4), d.substr(4, 2)-1, d.substr(6, 2));

หากคุณสามารถหาทางออกที่ดีกว่าได้โปรดแบ่งปัน! :-)


นั่นเป็นทางออกที่ยอดเยี่ยม ปัญหาเดียวที่ฉันเห็นคือdateStringอาร์กิวเมนต์เป็นเพียงตัวสร้าง Date () เพื่อแยกวิเคราะห์อย่างถูกต้อง ตัวอย่างเช่นการจัดYYYYMMDDรูปแบบที่ฉันให้ไว้ในคำถามนั้นจะล้มเหลว
Francisc

22
คำตอบนี้มีข้อบกพร่องอยู่ในนั้น ตั้งนาฬิกาของคุณเป็น 12:01 น. เมื่อเวลา 12:01 น. หากคุณคิดเงินตามบัญชี ('2012-03-27') (วันที่วันนี้) คุณจะได้รับคำตอบที่ศูนย์ถึงแม้ว่ามันควรจะเท่ากับ 1 ข้อผิดพลาดนี้มีอยู่ตลอดเวลา 12:00 น. นี่คือเนื่องจากคำสั่งที่ไม่ถูกต้องที่ปีมี 365.25 วันในนั้น มันไม่ใช่. เรากำลังติดต่อกับปีปฏิทินไม่ใช่ความยาวของวงโคจรของโลก (ซึ่งมีความแม่นยำมากกว่า 365.256363 วัน) ปีมี 365 วันยกเว้นปีอธิกสุรทินซึ่งมี 366 วัน นอกจากนั้นประสิทธิภาพของบางอย่างเช่นนี้ก็ไม่มีความหมาย การบำรุงรักษามีความสำคัญมากกว่า
Eric Brandel

1
ขอบคุณสำหรับการแก้ปัญหาของคุณ Kristoffer ฉันสามารถถามสิ่งที่ + ใหม่เปรียบเทียบกับเพิ่งใหม่ได้หรือไม่และอีกสองตัวหนอน (~) เป็นการตอบแทน
Frank Jensen

1
@ FrankJensen สวัสดี Frank ฉันก็อยากรู้อยากเห็นเหมือนกันและพบคำตอบนี้: ตัวหนอนคู่แปลงคำทักทายลอยไปเป็นจำนวนเต็ม
Stano

1
@FrankJensen โดย tilde จะแปลงค่าตัวเลข (ค่าไบนารี) ในขณะที่แปลง float เป็นจำนวนเต็ม (ปูพื้น) ดังนั้นเครื่องหมาย tilde สองตัวจะให้คุณปัดเศษตัวเลข + ด้านหน้าของวันที่ใหม่ () แปลงวัตถุให้เป็นตัวแทนจำนวนเต็มของวัตถุวันนี้ยังสามารถใช้กับสตริงตัวเลขเช่น +21 '21 === 21
Kristoffer Dorph

55

ด้วย momentjs:

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

2
@RicardoPontual ต้องใช้ momentjs ดังนั้นจึงไม่ใช่คำตอบที่ดีที่สุด
itzmukeshy7 7

13
@ itzmukeshy7 แน่นอนเพื่อให้ได้คำตอบที่ดีที่สุดอย่างน้อยก็ควรจะต้อง jQuery;)
thomaux

@thomaux มันขึ้นอยู่กับสภาพแวดล้อมการพัฒนาโดยสิ้นเชิง!
itzmukeshy7 7

@ itzmukeshy7 ผ่อนคลายเป็นเรื่องตลก;) ดู: meta.stackexchange.com/a/19492/173875
thomaux

2
@thomaux ฉันรู้ว่ามันเป็นเรื่องตลก;)
itzmukeshy7

38

ทำความสะอาดโซลูชัน one-liner โดยใช้ 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

ฉันใช้ปี 365.25 วัน (0.25 เนื่องจากเผ่นปี) ซึ่งเป็น 3.15576e + 10 มิลลิวินาที (365.25 * 24 * 60 * 60 * 1000) ตามลำดับ


1
ค่อนข้างเจ้าระเบียบเรียบร้อย - คุณช่วยอธิบายความหมายของ 3.15576e + 10 ได้ไหม?
ว่างเปล่า

1
ใช่มันเป็นการดีที่จะเพิ่มบรรทัดต่อไปนี้ก่อนฟังก์ชั่น:const yearInMs = 3.15576e+10 // Using a year of 365.25 days (because leap years)
ลูคัส Janon

12

ก่อนหน้านี้ฉันได้สร้างฟังก์ชั่นโดยมีวัตถุประสงค์ดังกล่าว:

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;
}

ใช้วัตถุ Date เป็นอินพุทดังนั้นคุณต้องแยก'YYYYMMDD'สตริงวันที่ที่จัดรูปแบบ:

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

อ่าใช่ฉันพลาดปีอธิกสุรทิน ขอบคุณ.
Francisc

1
สิ่งนี้ให้ค่าที่ไม่ถูกต้องสำหรับชุดค่าผสมวันที่ที่เลือก! ตัวอย่างเช่นถ้าbirthDateเป็น5 มกราคม 1980และวันที่ปัจจุบันเป็นที่4 มกราคม 2005แล้วฟังก์ชั่นจะไม่ถูกต้องรายงานageถึง 25 ... ค่าที่ถูกต้องเป็น 24
บร็อคอดัมส์

@BrockAdams ทำไมนี่คืออะไร ฉันกำลังมีปัญหานี้ในขณะนี้ ขอบคุณ
แจ็ค H

@VisionIncision เนื่องจากไม่สามารถจัดการกับสภาพขอบได้อย่างถูกต้อง เชื่อหรือไม่ว่ารหัสจากคำถามเป็นวิธีที่ดีที่สุดแม้ว่าจะดูเหมือนว่าหนึ่งในคำตอบในภายหลังอาจมีการบรรจุใหม่ให้เหมาะสมยิ่งขึ้น
Brock Adams

CMS สวัสดี :-) ฉันเขียนคำถามนี้ ( stackoverflow.com/questions/16435981/ … ) และฉันได้รับการบอกว่าถ้าฉันต้องการคำตอบที่ถูกต้อง 100% ฉันควรตรวจสอบทุกปี - ถ้าเป็นปีอธิกสุรทินและสุดท้าย เศษ (ดูคำตอบของ Guffa) ฟังก์ชั่นของคุณ (ส่วนหนึ่ง) ทำเช่นนั้น แต่ฉันจะใช้เพื่อคำนวณอายุที่ถูกต้อง 100% ได้อย่างไร DOB เริ่มไม่ค่อยที่ 1/1 / yyyy ..... ดังนั้นฉันจะใช้ func ของคุณเพื่อคำนวณอายุที่แน่นอนได้อย่างไร?
Royi Namir

10

นี่คือวิธีการแก้ปัญหาของฉันเพียงผ่านในวันที่แยกได้:

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

ทางเลือกอื่นเพราะทำไม:

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';
}

ขอบคุณที่หาอายุได้ง่ายในปีเดือนและวันที่
Sumit Kumar Gupta

5

เพื่อทดสอบว่าวันเกิดผ่านไปแล้วหรือยังฉันกำหนดฟังก์ชันตัวช่วยDate.prototype.getDoYซึ่งจะส่งกลับจำนวนวันของปีอย่างมีประสิทธิภาพ ที่เหลือก็ค่อนข้างอธิบายตนเอง

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

สิ่งนี้จะให้ผลลัพธ์ที่ไม่ถูกต้องในปีอธิกสุรทินสำหรับวันเกิดหลังวันที่ 28 กุมภาพันธ์ มันอายุคนเช่นนี้ 1 วัน EG: สำหรับวันเกิด = 2001/07/04ฟังก์ชั่นนี้จะกลับมา 7 ปีบน2008/07/03

@Brock: ขอบคุณ หากฉันไม่ผิดฉันได้แก้ไขพฤติกรรมที่ผิดพลาดนี้
Marcel Korpel

ใช่ฉันคิดว่าคุณอาจมี (ยังไม่ได้ทดสอบอย่างจริงจังเพียงวิเคราะห์) แต่สังเกตว่าโซลูชันใหม่นั้นไม่ง่ายและไม่สวยงามกว่าโซลูชันของ OP (ไม่นับว่าโซลูชันนี้ถูกห่อหุ้มอย่างเหมาะสมในฟังก์ชั่น) ... คำตอบของ OP นั้นง่ายต่อการเข้าใจ (เช่นการตรวจสอบเพื่อทดสอบหรือแก้ไข) บางครั้งเรียบง่ายและตรงไปตรงมาดีที่สุด IMO
Brock Adams

@Brock: ฉันเห็นด้วยอย่างเต็มที่: ฉันต้องคิดเกี่ยวกับสิ่งที่ฟังก์ชั่นนี้ทำและนั่นไม่เคยเป็นสิ่งที่ดีเลย
Marcel Korpel

ไม่ควร "ถ้า (doyNow <doyBirth)" เป็น "ถ้า (doyNow <= doyBirth)"? ในการทดสอบทั้งหมดของฉันวันนั้นถูกปิดโดยหนึ่งและที่คงที่
Ted Kulp

5

ฉันคิดว่าอาจเป็นเช่นนั้น:

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

ทำงานได้กับการประทับเวลา

age(403501000000)
//34

รหัสนี้จะคำนวณบุคคลที่มีอายุเท่ากันตลอดทั้งปี ในตัวอย่างของคุณถ้าวันนี้เป็น '09 / 19/2018 'รหัสจะให้ 37 แต่อายุ (วันก่อนวันเกิด) จะเป็น 36 ...
Steve Goossens

4

ฉันต้องเขียนฟังก์ชันนี้เพื่อตัวเอง - คำตอบที่ยอมรับนั้นค่อนข้างดี แต่ IMO สามารถใช้การล้างข้อมูลได้ นี่ใช้เวลา unix สำหรับ dob เพราะนั่นเป็นข้อกำหนดของฉัน แต่สามารถปรับให้ใช้สตริงได้อย่างรวดเร็ว:

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

สังเกตว่าฉันใช้ค่าคงที่ 31 ในฟังก์ชัน measureDays ของฉัน การคำนวณทั้งหมดใส่ใจว่า "วันแห่งปี" เป็นตัวชี้วัดที่เพิ่มความน่าเบื่อของการประทับเวลา

หากใช้การประทับเวลาหรือสตริง javascript แน่นอนว่าคุณจะต้องลบค่าตัวคูณ 1,000


n ไม่ได้ถูกกำหนด ฉันคิดว่าคุณหมายถึงตอนนี้ 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;
}

วิธีรับอายุเมื่อป้อนวันที่ในยุโรป:

getAge('16-03-1989')

ขอบคุณสำหรับคำแนะนำของคุณในstackoverflow.com/a/13367162/1055987จับดี
JFK

3

อีกวิธีหนึ่งที่เป็นไปได้ด้วยmoment.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

ฉันได้ตรวจสอบตัวอย่างที่แสดงก่อนหน้านี้และพวกเขาไม่ได้ทำงานในทุกกรณีและด้วยเหตุนี้ฉันจึงสร้างสคริปต์ของฉันเอง ฉันทดสอบสิ่งนี้และทำงานได้อย่างสมบูรณ์

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 ถึง 2001-02-28 ควรเป็นหนึ่งปีหรือไม่ ถ้าเป็นเช่นนั้นข้างต้นไม่สมบูรณ์ :-)
RobG

2

นั่นเป็นวิธีที่ดีที่สุดสำหรับฉัน:

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

รับอายุ (ปีเดือนและวัน) จากวันเดือนปีเกิดด้วย javascript

ฟังก์ชั่น calcularEdad (ปี, เดือนและวัน)

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";
    }

ฟังก์ชั่น 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

ทำงานได้สมบูรณ์แบบสำหรับฉันพวก

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

0

ฉันรู้ว่านี่เป็นเรื่องเก่ามาก แต่ฉันต้องการที่จะนำไปใช้ในการดำเนินการนี้ที่ฉันเขียนเพื่อหาอายุที่ฉันเชื่อว่าถูกต้องมากขึ้น

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

แน่นอนคุณสามารถปรับตัวให้เข้ากับรูปแบบอื่น ๆ ของการรับพารามิเตอร์ หวังว่านี่จะช่วยให้ใครบางคนกำลังมองหาทางออกที่ดีกว่า


0

ฉันใช้วิธีนี้โดยใช้ตรรกะแทนคณิตศาสตร์ มันแม่นยำและรวดเร็ว พารามิเตอร์คือปีเดือนและวันเกิดของบุคคล มันจะคืนค่าอายุของบุคคลนั้นเป็นจำนวนเต็ม

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;
            }
        }
    }

สตริงหรือวัตถุวันที่สำหรับการป้อนข้อมูลตาม OP
nazim

0

การนำมาใช้จากการโพสต์ของ OP ของ naveen และต้นฉบับฉันสิ้นสุดด้วย stub วิธีการที่ใช้ซ้ำได้ซึ่งยอมรับทั้งสตริงและ / หรือวัตถุ JS Date

ฉันตั้งชื่อมันgregorianAge()เพราะการคำนวณนี้ให้วิธีที่เราแสดงอายุโดยใช้ปฏิทินเกรกอเรียน เช่นไม่นับปีสิ้นสุดถ้าเดือนและวันอยู่ก่อนเดือนและวันเกิดของปี

/**
 * 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

อีกสองตัวเลือก:

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

ฉันได้ปรับปรุงบางคำตอบก่อนหน้านี้แล้ว

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

ฉันหวังว่าจะช่วย: D


0

นี่คือวิธีง่ายๆในการคำนวณอายุ:

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

มันแตกต่างจากปีที่เรียบง่ายระหว่างนี้และปีเกิด จากนั้นจะลบปีหากวันนี้เร็วกว่าวันเกิด (คิดเกี่ยวกับอายุของคุณเพิ่มขึ้นระหว่างปีในวันเกิดของคุณ)
Steve Goossens

0

คุณสามารถใช้สิ่งนี้เพื่อ จำกัด อายุในแบบฟอร์มของคุณ -

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

ฉันสายเกินไป แต่ฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุดในการคำนวณวันเกิด

$(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 );
    }
}

แท็ก HTML:

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

หวังว่านี่จะช่วยได้


-1

นี่คือทางออกที่ง่ายและแม่นยำที่สุดที่ฉันจะได้รับ:

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

และนี่คือตัวอย่างที่จะพิจารณาวันที่ 29 กุมภาพันธ์ -> 28 กุมภาพันธ์ต่อปี

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

มันใช้ได้กับอายุติดลบด้วย!


เช่นเดียวกับคนอื่น ๆ มันคิดว่า 2000-02-29 ถึง 2001-02-28 คือศูนย์ปี
RobG

ฉันได้อัปเดตคำตอบของฉันเพื่อรองรับคดีขอบก้าวกระโดด ขอบคุณ @RobG
wizulus

-1

อีกวิธีหนึ่ง:

/**
 * 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

ด้วยmomentjs "fromNow" วิธีนี้ช่วยให้คุณสามารถทำงานกับวันที่จัดรูปแบบเช่น: 03/15/1968

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";

เป็นรุ่นต้นแบบ

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

}

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