กลับไปที่บล็อก
2 min read

วิธีการคำนวณอายุใน Python (ตัวอย่าง datetime และ dateutil)

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

วิธีการคำนวณอายุใน Python (ตัวอย่าง datetime และ dateutil)

วิธีการคำนวณอายุใน Python (ตัวอย่าง datetime และ dateutil)

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

1) ปีที่เสร็จสมบูรณ์ (คำจำกัดความที่ปลอดภัย)

ซึ่งจะส่งคืนจำนวนปีเต็มนับตั้งแต่วันเดือนปีเกิด (DOB) ลบ 1 หากวันเกิดยังไม่เกิดขึ้นในปีปัจจุบัน

from datetime import date

def age_years(dob: date, as_of: date | None = None) -> int:
    if as_of is None:
        as_of = date.today()
    years = as_of.year - dob.year
    before_birthday = (as_of.month, as_of.day) < (dob.month, dob.day)
    return years - 1 if before_birthday else years

print(age_years(date(2000, 10, 5), date(2026, 2, 26)))

2) อายุ ณ วันที่ระบุ (ไม่ใช่แค่วันนี้)

กรณีการใช้งานจำนวนมากจำเป็นต้องมีวันที่ "ณ วันที่": ราคาประกันภัย การตรวจสอบสิทธิ์ การตัดสิทธิ์ของโรงเรียน รายงาน ฟังก์ชั่นด้านบนรองรับผ่านแล้วas_of.

3) เอาต์พุตสไตล์ที่แน่นอน (ปีและเดือน)

หากคุณต้องการผลลัพธ์เช่น "25 ปี 4 เดือน" ให้ใช้dateutil.relativedelta(จัดการความยาวเดือนได้อย่างถูกต้อง)

from datetime import date
from dateutil.relativedelta import relativedelta

def age_ym(dob: date, as_of: date | None = None):
    if as_of is None:
        as_of = date.today()
    rd = relativedelta(as_of, dob)
    return rd.years, rd.months

print(age_ym(date(2000, 10, 5), date(2026, 2, 26)))

4) ข้อผิดพลาดทั่วไป (และวิธีหลีกเลี่ยง)

  • วันเกิดวันอธิกสุรทิน:ตัดสินใจว่าคุณต้องการปฏิบัติต่อวันที่ 29 กุมภาพันธ์ในปีที่ไม่ใช่ปีอธิกสุรทินอย่างไร หลายระบบใช้วันที่ 28 ก.พ. หรือ 1 มี.ค. พฤติกรรมของห้องสมุดมีความสำคัญ ดังนั้นให้ทดสอบดู
  • วันที่และเวลา:สำหรับ DOB ให้เลือกdateเกินdatetime. หากคุณต้องใช้วันที่และเวลา ให้ทำให้เป็นเขตเวลาเดียวกันให้เป็นมาตรฐานก่อน
  • DOB ในอนาคตหรือค่าที่หายไป:ตรวจสอบอินพุตเพื่อหลีกเลี่ยงอายุเชิงลบหรือข้อขัดข้อง

ตรวจสอบด่วน (ไม่มีรหัส)

หากคุณต้องการผลลัพธ์ที่รวดเร็วเพียงรายการเดียว ให้ใช้เครื่องคิดเลขออนไลน์:คำนวณอายุออนไลน์.

คำแนะนำที่เกี่ยวข้อง

คำถามที่พบบ่อย

ทำไม (today.year - dob.year) ถึงผิดในบางครั้ง?

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

ฉันควรใช้ datetime หรือ date เป็นวันเกิดหรือไม่?

ใช้dateเมื่อเป็นไปได้ DOB คือวันตามปฏิทิน และโซนเวลาสามารถเปลี่ยนวันที่และเวลาข้ามวันได้