Hai kiểu cốt lõi: date và datetime
Module datetime cho bạn bốn thứ đáng biết: date, time, datetime và timedelta. Ba thứ đầu đúng như tên gọi; thứ tư là một khoảng thời gian.
Một date biểu diễn một ngày (năm, tháng, ngày) mà không kèm giờ. Một datetime là ngày cộng thêm giờ. Nếu bạn không cần giờ, date là lựa chọn gọn hơn.
Tạo một ngày cụ thể
Tạo trực tiếp:
Các đối số là year, month, day với date, và tối đa year, month, day, hour, minute, second, microsecond với datetime.
Đọc từng trường
Mọi date và datetime đều có thuộc tính:
isoformat() là bạn đồng hành cho đầu ra dành cho máy đọc: nó tạo ra thứ như "2026-04-20T09:30:15" mà các hệ thống khác phân tích được mà không nhầm lẫn.
Định dạng bằng strftime
Với đầu ra cho người đọc, .strftime(fmt) biến một date hoặc datetime thành chuỗi đã định dạng:
Những mã định dạng đáng nhớ nhất:
%Y: năm 4 chữ số (2026)%m: số tháng, thêm số 0 phía trước (04)%d: ngày trong tháng, thêm số 0 phía trước (20)%H/%I: giờ, dạng 24 giờ / 12 giờ%M: phút%S: giây%A/%a: tên thứ đầy đủ / viết tắt (Monday / Mon)%B/%b: tên tháng đầy đủ / viết tắt (April / Apr)%p: AM/PM
Bạn không cần thuộc lòng; hãy lưu lại một bảng tra cứu và mở ra khi cần.
Phân tích chuỗi bằng strptime
Chiều ngược lại: lấy một chuỗi có hình dạng đã biết và biến nó thành datetime:
Chuỗi định dạng phải khớp chính xác với đầu vào. Nếu không khớp, strptime ném ra ValueError.
Với chuỗi ISO-8601 (chuẩn dành cho máy đọc), Python hiện đại có một lối tắt đơn giản hơn:
Nếu bạn phải xử lý đủ loại định dạng lộn xộn, package dateutil bên ngoài (pip install python-dateutil) có hàm parser.parse() dễ tính, sẽ đoán một cách hợp lý.
Tính toán với timedelta
Để tính toán với ngày tháng, hãy dùng timedelta cho khoảng chênh lệch hoặc độ dời:
Các đối số của timedelta: days, seconds, microseconds, milliseconds, minutes, hours, weeks. Không có months hay years, vì độ dài tháng không cố định. Để tính theo tháng hoặc năm, hãy dùng dateutil.relativedelta:
from dateutil.relativedelta import relativedelta
from datetime import date
today = date.today()
next_quarter = today + relativedelta(months=3)
print(next_quarter)
Múi giờ: naive và aware
Một datetime không có thông tin múi giờ là naive: Python không biết nó thuộc múi giờ nào. Tính toán với datetime naive vẫn ổn khi bạn ở trong cùng một múi giờ; rắc rối bắt đầu ngay khi dữ liệu từ các múi giờ khác nhau gặp nhau.
Một datetime aware mang theo thông tin múi giờ. Hãy gắn múi giờ một cách tường minh:
Python 3.9 bổ sung module zoneinfo cho các múi giờ có tên (dùng cơ sở dữ liệu IANA của hệ thống):
Chuyển giữa các múi giờ bằng .astimezone():
Một quy tắc nên ghi nhớ: lưu datetime theo UTC, chỉ chuyển sang múi giờ địa phương lúc hiển thị. Chỉ một thói quen đó thôi đã ngăn được phần lớn bug về múi giờ.
Timestamp
Một Unix timestamp là số giây tính từ 1970-01-01 UTC. Python chuyển đổi rất dễ:
Timestamp hữu ích cho việc so sánh, sắp xếp và trao đổi với hệ thống khác. Với đầu ra cho người đọc, hãy chuyển ngược về datetime trước.
Đo thời gian chạy của một đoạn code
Để đo nhanh, hãy lấy hai datetime trừ cho nhau:
Để đo hiệu năng nghiêm túc hơn, hãy dùng time.perf_counter(): nó có độ phân giải dưới một micro giây và không bị ảnh hưởng khi đồng hồ hệ thống thay đổi. datetime.now() đủ dùng cho những con số kiểu "lời gọi API này mất bao lâu".
Những mẫu bạn sẽ dùng lại
Những điều cần nhớ
date,datetimevàtimedeltađáp ứng 90% nhu cầu.- Dùng ISO-8601 cho máy đọc;
strftimecho người đọc. - Lưu theo UTC; chuyển đổi lúc hiển thị.
- Dùng
zoneinfocho các múi giờ có tên. - Để tính theo tháng và năm, hãy dùng
dateutil.relativedelta.
Thêm một công cụ cho bộ đồ nghề thực tế của bạn: biểu thức chính quy, ngay sau đây.
Câu hỏi thường gặp
Làm sao lấy ngày giờ hiện tại trong Python?
datetime.now() trả về ngày giờ địa phương hiện tại. datetime.utcnow() trả về giờ UTC (dù cách được ưa dùng hiện nay là datetime.now(timezone.utc), vì utcnow() trả về một datetime naive). Nếu chỉ cần ngày, hãy dùng date.today().
Làm sao định dạng ngày thành chuỗi?
Dùng .strftime(format) với các mã định dạng như %Y-%m-%d cho năm-tháng-ngày. Ví dụ: datetime.now().strftime('%Y-%m-%d %H:%M'). Để chuyển chuỗi ngược lại thành ngày, dùng datetime.strptime(text, format) với cùng các mã định dạng đó.
Làm sao cộng thêm ngày vào một ngày trong Python?
Dùng timedelta: from datetime import date, timedelta; date.today() + timedelta(days=7). timedelta hỗ trợ ngày, giờ, phút, giây, tuần và hơn nữa. Để tính theo tháng và năm, hãy dùng dateutil.relativedelta bên ngoài: timedelta không biết gì về tháng.