"Năm nay bạn ấy bao nhiêu tuổi?" nghe như một phép trừ, và phần lớn thời gian đúng là vậy. Nhưng tuổi chính xác theo năm, tháng và ngày có vài cái bẫy: sinh nhật năm nay chưa tới, các tháng dài ngắn khác nhau, và những người sinh ngày 29/2 chỉ có sinh nhật thật bốn năm một lần. Bài này đi qua từng trường hợp bằng ngày tháng cụ thể, theo đúng quy tắc của công cụ tính tuổi. Mọi con số dưới đây được tính bằng chính logic của công cụ, và số ngày được kiểm tra lại riêng bằng mô-đun datetime của Python.
Cách tính cơ bản
Tuổi chính xác được đếm qua hai bước:
- Đếm tiến từ ngày sinh theo từng tháng tròn, càng xa càng tốt nhưng không vượt quá ngày cần tính.
- Đếm số ngày còn lại.
Mười hai tháng tròn là một năm. Lấy ví dụ người sinh ngày 15/5/1990, tính tuổi vào ngày 13/10/2026:
- 36 năm tròn đưa ta đến 15/5/2026.
- Thêm bốn tháng tròn nữa là 15/9/2026. Tháng thứ năm sẽ là 15/10, đã qua ngày cần tính.
- Từ 15/9 đến 13/10 có 28 ngày.
Vậy tuổi là 36 năm, 4 tháng và 28 ngày. Tính tổng là 436 tháng, hay 13.300 ngày. Ngẫu nhiên 13.300 ngày đúng bằng 1.900 tuần, nên ngày 15/5/1990 cũng là thứ Ba giống ngày 13/10/2026. Sinh nhật tới là thứ Bảy 15/5/2027, còn 214 ngày, khi người đó tròn 37 tuổi.
Bẫy 1: chỉ trừ số năm
2026 − 1990 = 36 chỉ đúng khi sinh nhật năm nay đã qua. Với người sinh ngày 14/10/1990, vào ngày 13/10/2026 phép trừ vẫn ra 36, nhưng tuổi chính xác là 35 năm, 11 tháng và 29 ngày: ngày mai mới là sinh nhật.
Chuyện này quan trọng hơn ta tưởng. Giới hạn tuổi khi nhập học, thi bằng lái, nghỉ hưu hay nộp hồ sơ xin việc thường được viết là "đủ N tuổi tính đến ngày D", và chỉ một ngày là đủ để quyết định. Nếu chỉ so năm, bạn sẽ sai với tất cả những ai có sinh nhật nằm giữa ngày cần tính và cuối năm.
Bẫy 2: các tháng không dài bằng nhau
Tháng có 28, 29, 30 hoặc 31 ngày, nên "cộng một tháng" cần có quy tắc khi tháng sau không có ngày đó. Quy tắc mà công cụ dùng, cũng là quy tắc của bảng tính (hàm EDATE), của hầu hết ngôn ngữ lập trình và của ngân hàng:
Khi tháng đích không có ngày đó, lấy ngày cuối cùng của tháng.
Với em bé sinh ngày 31/1/2026:
| Ngày | Tuổi chính xác |
|---|---|
| 28/2/2026 | 1 tháng 0 ngày |
| 1/3/2026 | 1 tháng 1 ngày |
| 30/3/2026 | 1 tháng 30 ngày |
| 31/3/2026 | 2 tháng 0 ngày |
Bảng này còn ẩn một quy tắc thứ hai: mỗi tháng được đếm từ ngày sinh gốc, không bao giờ từ mốc trước đó. Nếu nối tiếp các bước (31/1 → 28/2 → 28/3), em bé sẽ "tròn hai tháng" sớm ba ngày, vào 28/3. Đếm từng mốc từ ngày 31/1 gốc thì ra 31/3, đúng như mọi người vẫn nghĩ.
Bẫy 3: sinh ngày 29/2
Người sinh ngày 29/2/2000 chỉ có sinh nhật thật vào năm nhuận: 2004, 2008, v.v. Ở các năm khác có hai cách trả lời phổ biến cho câu hỏi "khi nào thêm một tuổi?":
- Ngày 28/2, ngày cuối của tháng. Đây là mặc định của công cụ, khớp với quy tắc cuối tháng ở trên.
- Ngày 1/3, ngày ngay sau 28/2. Một số luật dùng cách này; ví dụ ở Anh và xứ Wales, người sinh 29/2 đủ tuổi thành niên vào ngày 1/3 ở năm không nhuận.
Chênh lệch là một ngày, và nó lộ ra ở hai chỗ. Vào ngày 28/2/2001, người đó tròn 1 tuổi theo quy tắc 28/2, nhưng mới 11 tháng 30 ngày theo quy tắc 1/3. Và vào ngày 13/10/2026, số ngày đếm ngược đến sinh nhật tới là 138 ngày (đến 28/2/2027) hoặc 139 ngày (đến 1/3/2027). Riêng tuổi vào ngày đó, 26 năm, 7 tháng và 14 ngày, thì giống nhau ở cả hai cách, vì 13/10 cách xa tháng 2.
Nếu hạn chót hay độ tuổi theo luật phụ thuộc vào điều này, hãy xem quốc gia hoặc hợp đồng của bạn dùng quy tắc nào. Công cụ cho phép đổi qua lại.
Bẫy 4: chia số ngày cho 30 hoặc 365
Rất dễ tính tuổi ra số ngày rồi đem chia. Với người sinh 15/5/1990, 13.300 ngày ÷ 30 = 443,3 "tháng", nhưng thực tế chỉ có 436 tháng tròn. Chia cho 365 được 36,44 "năm", chia cho 365,25 được 36,41: gần đúng, nhưng không cho biết sinh nhật đã qua hay chưa, và phần thập phân không đổi được thành tháng và ngày. Hãy đếm tháng theo lịch trước, rồi đến ngày; chỉ dùng con số tổng khi bạn thật sự cần tổng.
Tổng số giờ cũng có một điểm nhỏ. Công cụ tính giờ bằng số ngày × 24 (13.300 ngày = 319.200 giờ). Ngày có đổi giờ mùa hè thật ra dài 23 hoặc 25 giờ trên đồng hồ, nhưng khi không biết giờ sinh và múi giờ, một con số "chính xác hơn" chỉ trông có vẻ chính xác.
Bẫy 5: con giáp
Mười hai con giáp đi theo năm âm lịch, bắt đầu từ Tết, rơi vào khoảng 21/1 đến 20/2. Công cụ tính theo năm dương lịch: đúng với người sinh sau Tết, và chỉ gần đúng với người sinh tháng 1 hoặc đầu tháng 2.
Với ngày 20/1/1990, năm dương lịch cho ra Canh Ngọ, tuổi Ngựa. Nhưng Tết năm 1990 rơi vào ngày 27/1, nên em bé sinh ngày 20/1 vẫn thuộc năm Kỷ Tỵ, tuổi Rắn. Công cụ sẽ nhắc với mọi trường hợp sinh tháng 1 và đầu tháng 2, kèm con giáp của năm trước, để bạn biết cần tra ngày Tết của năm sinh. (Việt Nam dùng con Mèo cho chi Mão, trong khi lịch Trung Quốc dùng con Thỏ.)
Những lỗi thường gặp
- Chỉ so số năm. Sai với tất cả những ai chưa tới sinh nhật trong năm nay.
- Cộng tháng nối tiếp. Cộng từng tháng một sẽ bị lệch sau một tháng ngắn. Hãy đếm mỗi mốc từ ngày sinh gốc.
- Mặc định chỉ có một quy tắc cho ngày 29/2. Cả 28/2 và 1/3 đều đang được dùng; hãy kiểm tra quy tắc nào áp dụng.
- Chia số ngày cho 30 hoặc 365. Dùng tháng và ngày theo lịch, chỉ tính tổng khi cần.
- Nhầm tuổi dương lịch với tuổi mụ. Cách tính truyền thống cộng một tuổi khi sinh ra và thêm một tuổi mỗi dịp Tết, nên có thể nhiều hơn tuổi trên căn cước một hoặc hai. Giấy tờ dùng tuổi dương lịch.
- Dùng đồng hồ máy tính lúc nửa đêm. Nếu tự lập trình, đừng trừ hai đối tượng
Datecủa JavaScript lấy lúc nửa đêm giờ địa phương: qua ngày đổi giờ, một ngày có thể chỉ dài 23 giờ và phép chia làm tròn sai. Hãy làm việc với giá trị năm-tháng-ngày thuần.
Thử ngay
Mở công cụ tính tuổi, nhập ngày sinh và đổi ô "tính tuổi vào ngày" để thử các trường hợp trên: 31/1 đến 28/2, ngày 29/2 ở năm không nhuận, hay sinh nhật vào ngày mai. Muốn tính số ngày giữa hai ngày bất kỳ, ngày làm việc hay cộng tháng vào một ngày, công cụ tính ngày dùng cùng các quy tắc lịch đó.