Máy Tính Tuổi — Tuổi Chính Xác Tính Bằng Năm, Tháng & Ngày
Máy tính tuổi miễn phí: nhập ngày sinh của bạn để có tuổi chính xác tính bằng năm, tháng và ngày, cộng với tổng tuần, ngày, giờ và sinh nhật tiếp theo của bạn.
Máy Tính Tuổi
Bạn được sinh vào Monday
Sinh nhật tiếp theo: 144 ngày nữa (sắp tròn 37)
Tuổi của bạn tính bằng đơn vị khác
Tiến trình cuộc sống
Tuổi của bạn so với khoảng tham chiếu 80 năm minh họa.
Tài liệu hướng dẫn
Máy tính này làm gì
Nhập ngày sinh nhật của bạn và nó sẽ cho bạn biết chính xác bạn bao nhiêu tuổi — tính bằng năm, tháng và ngày — giống cách bạn nói ra ("Tôi 33 tuổi, 4 tháng và 5 ngày"). Nó cũng hiển thị tuổi tương tự được tính hoàn toàn bằng tháng, tuần, ngày, giờ, phút và giây, ngày trong tuần bạn được sinh ra, và còn bao lâu đến sinh nhật tiếp theo của bạn.
Để biết tuổi hiện tại của bạn, hãy để trường thứ hai ở ngày hôm nay, hoặc thay đổi thành bất kỳ ngày quá khứ hoặc tương lai nào để tìm tuổi của bạn vào ngày đó.
Quy tắc duy nhất khiến tuổi tính phức tạp: tháng và năm không phải là một số ngày cố định. Tháng 2 có 28 hoặc 29 ngày; các tháng khác có 30 hoặc 31 ngày. Vì vậy "1 tháng" có nghĩa là "cùng số ngày, một tháng sau" — không phải "30 ngày." Máy tính này tuân theo quy tắc lịch, đó là lý do tại sao nó có thể khác nhau 1-2 ngày so với các công cụ chỉ chia cho 30 hoặc 365.
Cách tính tuổi của bạn
Tuổi là khoảng cách giữa hai ngày. Có hai cách trung thực để đo khoảng cách đó, và công cụ này hiển thị cả hai.
1. Tuổi lịch (năm, tháng, ngày). Đếm toàn bộ năm từ ngày sinh nhật của bạn, sau đó toàn bộ tháng, rồi các ngày còn lại:
- Đếm toàn bộ năm kể từ khi sinh.
- Từ sinh nhật gần nhất, đếm toàn bộ tháng.
- Từ đó, đếm các ngày còn lại.
Phần tinh tế là bước 3 gần ranh giới tháng. Ai đó sinh ngày 31 tháng Một, được đo vào 1 tháng Ba, là 1 tháng và 1 ngày tuổi — vì "một tháng sau 31 tháng Một" hạ cánh vào 28/29 tháng Hai (không có 31 tháng Hai), và 1 tháng Ba là một ngày sau đó. Máy tính này cố định đến cuối tháng ngắn hơn, phù hợp với quy tắc dateutil.relativedelta được sử dụng rộng rãi, vì vậy sinh nhật vào cuối tháng không bao giờ tạo ra số ngày âm.
2. Tổng thời gian trôi qua (ngày, giờ, giây). Đối với các số liệu "tuổi của bạn tính bằng đơn vị khác", hai ngày được chuyển đổi thành tính toán toàn bộ ngày và nhân ra:
Cả hai ngày được cố định đến nửa đêm UTC trước tiên, vì vậy những thay đổi tiết kiệm ánh sáng ban ngày không thể cộng hoặc giảm một giờ và làm lệch số ngày. Tuần là ngày ÷ 7 (làm tròn xuống); giờ, phút và giây là số ngày được mở rộng.
Tại sao không chỉ chia ngày cho 365? Vì bạn sẽ trôi dạt. Chia 7.305 ngày cho 365 được 20,01 năm; chia cho 365,25 được 20,00 — nhưng không ai biết những năm nào là năm nhuận hoặc những tháng nào bạn thực sự sống qua. Đếm lịch là chính xác; chia ngày là một xấp xỉ. Sử dụng tuổi lịch cho "tôi bao nhiêu tuổi", và tổng ngày/tuần cho công việc thời gian trôi qua chính xác (thời gian dùng thuốc, thời lượng dự án, đếm ngược cột mốc).
Ví dụ đã làm
Sinh 1 tháng Một 2000, được đo 1 tháng Một 2020:
| Thước đo | Giá trị |
|---|---|
| Tuổi lịch | 20 năm, 0 tháng, 0 ngày |
| Tổng ngày | 7.305 |
| Tổng tuần | 1.043 |
| Ngày sinh | Thứ Bảy |
7.305 ngày = 20 × 365 + 5 ngày nhuận (2000, 2004, 2008, 2012, 2016). Chi tiết duy nhất đó — năm ngày thêm hầu hết mọi người quên — chính xác là lý do tại sao máy tính đánh bại phép tính nhẩm.
Tuổi trong mã
Tính toán tương tự bằng từng ngôn ngữ. Đối với tuổi lịch, hãy ưu tiên thư viện ngày tháng tích hợp sẵn thay vì số học tay — nó đã biết năm nhuận và độ dài tháng.
1' Whole days between two dates (A1 = birth, B1 = target):
2=B1-A1
3
4' Calendar age in complete years / months / leftover days:
5=DATEDIF(A1, B1, "y") & " years, " & DATEDIF(A1, B1, "ym") & " months, " & DATEDIF(A1, B1, "md") & " days"
61from dateutil.relativedelta import relativedelta
2from datetime import date
3
4birth, target = date(2000, 1, 1), date(2020, 1, 1)
5
6age = relativedelta(target, birth) # calendar age
7print(f"{age.years}y {age.months}m {age.days}d")
8
9total_days = (target - birth).days # total elapsed days
10print(total_days) # 7305
111function calendarAge(birth, target) {
2 let months = (target.getUTCFullYear() - birth.getUTCFullYear()) * 12
3 + (target.getUTCMonth() - birth.getUTCMonth());
4 const anchor = new Date(Date.UTC(birth.getUTCFullYear(), birth.getUTCMonth() + months, birth.getUTCDate()));
5 if (anchor > target) months--;
6 return { years: Math.floor(months / 12), months: months % 12 };
7}
8
9const birth = new Date(Date.UTC(2000, 0, 1));
10const target = new Date(Date.UTC(2020, 0, 1));
11const totalDays = Math.floor((target - birth) / 86400000); // 7305
121import java.time.LocalDate;
2import java.time.Period;
3import java.time.temporal.ChronoUnit;
4
5LocalDate birth = LocalDate.of(2000, 1, 1);
6LocalDate target = LocalDate.of(2020, 1, 1);
7
8Period age = Period.between(birth, target); // 20y 0m 0d
9long totalDays = ChronoUnit.DAYS.between(birth, target); // 7305
101using System;
2
3var birth = new DateTime(2000, 1, 1);
4var target = new DateTime(2020, 1, 1);
5
6int years = target.Year - birth.Year;
7if (birth.AddYears(years) > target) years--; // not birthday yet
8long totalDays = (target - birth).Days; // 7305
91#include <chrono>
2using namespace std::chrono;
3
4// C++20 calendar types
5sys_days birth = year{2000}/1/1;
6sys_days target = year{2020}/1/1;
7
8auto total_days = (target - birth).count(); // 7305
9years_months_days ymd_diff{birth, target}; // year_month_day arithmetic
101package main
2
3import "time"
4
5func main() {
6 birth := time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)
7 target := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC)
8 totalDays := int(target.Sub(birth).Hours() / 24) // 7305
9 _ = totalDays
10}
111use chrono::{NaiveDate, Datelike};
2
3let birth = NaiveDate::from_ymd_opt(2000, 1, 1).unwrap();
4let target = NaiveDate::from_ymd_opt(2020, 1, 1).unwrap();
5
6let total_days = (target - birth).num_days(); // 7305
7let years = target.year() - birth.year(); // adjust if birthday not reached
81<?php
2$birth = new DateTime('2000-01-01');
3$target = new DateTime('2020-01-01');
4$diff = $birth->diff($target);
5
6echo "{$diff->y}y {$diff->m}m {$diff->d}d\n"; // 20y 0m 0d
7echo $diff->days; // 7305
81require 'date'
2
3birth = Date.new(2000, 1, 1)
4target = Date.new(2020, 1, 1)
5
6total_days = (target - birth).to_i # 7305
7years = target.year - birth.year
8years -= 1 if birth.next_year(years) > target
91birth <- as.Date("2000-01-01")
2target <- as.Date("2020-01-01")
3
4total_days <- as.integer(target - birth) # 7305
5Các câu hỏi phổ biến
Tôi chính xác bao nhiêu tuổi? Nhập ngày sinh nhật của bạn và để mục tiêu ở ngày hôm nay. Máy tính hiển thị tuổi của bạn tính bằng năm, tháng và ngày, và lặp lại tính bằng tổng ngày, tuần, giờ và giây.
Tại sao tuổi của tôi khác với máy tính khác? Hầu như luôn là phần dư tháng/ngày. Các công cụ không đồng ý về cách đếm các ngày sau tháng toàn bộ cuối cùng tại ranh giới tháng. Cái này cố định đến tháng ngắn hơn (quy tắc relativedelta); một công cụ chia cho 30 sẽ khác 1-2 ngày.
Nó có xử lý năm nhuận và sinh nhật 29 tháng Hai không? Có. Số ngày bao gồm mọi ngày nhuận trong phạm vi, và sinh nhật 29 tháng Hai được đo so với 28 tháng Hai / 1 tháng Ba trong các năm không nhuận mà không tràn.
Tôi có thể tính tuổi vào ngày quá khứ hoặc tương lai không? Có — đặt trường "Tuổi tại ngày" thành bất kỳ ngày nào. Một ngày trong tương lai cho bạn biết bạn sẽ bao nhiêu tuổi khi đó; ngày quá khứ, bạn đã bao nhiêu tuổi.
Còn về múi giờ? Ngày được chuẩn hóa đến UTC trước khi đếm, vì vậy tổng ngày toàn bộ ổn định bất kể bạn ở đâu hoặc tiết kiệm ánh sáng ban ngày có thay đổi không.
Nguồn
- Python
dateutil—relativedelta(quy tắc tháng/ngày tuổi lịch mà công cụ này tuân theo). - Java Platform —
Period.betweenvàChronoUnit.DAYS. - Microsoft Excel —
DATEDIFfunction. - MDN Web Docs —
Date. - Dershowitz, N., & Reingold, E. M. Calendrical Calculations: The Ultimate Edition. Cambridge University Press, 2018.