Menu

datetime trong Python: ngày, giờ, timedelta và múi giờ

Tìm hiểu thực tế về module datetime của Python: phân tích chuỗi ngày, định dạng, tính toán với ngày tháng và xử lý múi giờ mà không bị rối.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

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, datetime và timedelta đáp ứng 90% nhu cầu.
  • Dùng ISO-8601 cho máy đọc; strftime cho người đọc.
  • Lưu theo UTC; chuyển đổi lúc hiển thị.
  • Dùng zoneinfo cho 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.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu