Trong quá trình phát triển ứng dụng, việc làm việc với dữ liệu thời gian là tác vụ diễn ra vô cùng thường xuyên: từ việc ghi log hệ thống, đặt lịch hẹn, tính khoảng thời gian hết hạn của tài khoản đến xử lý dữ liệu giao dịch. Python cung cấp sẵn module tích hợp datetime giúp bạn làm việc với ngày và giờ một cách chính xác và tối ưu.
Bài viết này sẽ hướng dẫn bạn chi tiết các lớp dữ liệu cốt lõi trong module datetime, cách chuyển đổi dữ liệu thời gian thành chuỗi (và ngược lại), cũng như các phép toán cộng trừ thời gian thông qua timedelta.
1. Các Lớp Cốt Lõi Trong Module Datetime
Để bắt đầu sử dụng, bạn cần import module datetime. Module này cung cấp các lớp chính sau:
- date: Đại diện cho ngày (năm, tháng, ngày).
- time: Đại diện cho giờ (giờ, phút, giây, microsecond) độc lập với ngày.
- datetime: Kết hợp cả ngày và giờ.
- timedelta: Đại diện cho khoảng thời gian (khoảng lệch giữa hai thời điểm).
- timezone: Hỗ trợ xử lý múi giờ.
Lấy thời gian hiện tại và khởi tạo đối tượng
Để lấy ngày hoặc thời gian hiện tại, bạn có thể sử dụng các phương thức như date.today() hoặc datetime.now():
from datetime import date, time, datetime
# Lấy ngày hiện tại
today = date.today()
print("Ngày hiện tại:", today) # YYYY-MM-DD
# Lấy ngày và giờ hiện tại
now = datetime.now()
print("Thời gian hiện tại:", now)
# Truy cập các thuộc tính
print(f"Năm: {now.year}, Tháng: {now.month}, Ngày: {now.day}")
print(f"Giờ: {now.hour}, Phút: {now.minute}, Giây: {now.second}")
# Khởi tạo đối tượng thủ công
custom_date = date(2025, 12, 25)
custom_time = time(14, 30, 0)
custom_datetime = datetime(2025, 12, 25, 14, 30, 0)
print("Ngày lễ:", custom_datetime)2. Định Dạng Và Parse Chuỗi Ngày Tháng (strftime & strptime)
Khi nhận dữ liệu đầu vào từ người dùng hoặc API, thời gian thường ở dạng chuỗi (string). Ngược lại, khi hiển thị ra giao diện, bạn cần chuyển đối tượng datetime thành chuỗi theo định dạng mong muốn.
Chuyển datetime thành chuỗi với strftime()
Phương thức strftime() (String Format Time) dùng để định dạng đối tượng datetime thành chuỗi văn bản:
from datetime import datetime
now = datetime.now()
# Định dạng ngày/tháng/năm giờ:phút:giây
formatted_1 = now.strftime("%d/%m/%Y %H:%M:%S")
print("Định dạng Việt Nam:", formatted_1)
# Định dạng dạng tên tháng
formatted_2 = now.strftime("%B %d, %Y")
print("Định dạng tiếng Anh:", formatted_2)Một số mã định dạng phổ biến bao gồm:
%d: Ngày trong tháng (01 đến 31)%m: Tháng trong năm (01 đến 12)%Y: Năm 4 chữ số (ví dụ: 2025)%H: Giờ theo định dạng 24h (00 đến 23)%M: Phút (00 đến 59)%S: Giây (00 đến 59)
Chuyển chuỗi thành datetime với strptime()
Phương thức strptime() (String Parse Time) cho phép bạn ép kiểu một chuỗi ký tự thành đối tượng datetime để phục vụ tính toán:
from datetime import datetime
date_string = "15/08/2025 09:30:00"
format_pattern = "%d/%m/%Y %H:%M:%S"
# Chuyển đổi chuỗi thành đối tượng datetime
parsed_date = datetime.strptime(date_string, format_pattern)
print("Đối tượng datetime:", parsed_date)
print("Kiểu dữ liệu:", type(parsed_date))3. Tính Toán Khoảng Thời Gian Với Timedelta
Để thực hiện các phép cộng, trừ ngày tháng (ví dụ: tính thời hạn bảo hành, tính tuổi, hoặc đếm ngược sự kiện), Python sử dụng lớp timedelta.
from datetime import datetime, timedelta
now = datetime.now()
# Cộng thêm 7 ngày
future_date = now + timedelta(days=7)
print("7 ngày sau:", future_date.strftime("%d/%m/%Y"))
# Trừ đi 3 giờ 30 phút
past_time = now - timedelta(hours=3, minutes=30)
print("3 giờ 30 phút trước:", past_time.strftime("%H:%M:%S"))
# Tính khoảng cách giữa hai mốc thời gian
event_date = datetime(2025, 12, 31, 23, 59, 59)
difference = event_date - now
print(f"Còn lại: {difference.days} ngày và {difference.seconds // 3600} giờ.")
print("Tổng số giây còn lại:", difference.total_seconds())4. Khái Niệm Naive Và Aware Datetime
Thời gian trong Python được chia làm 2 loại:
- Naive Object: Không chứa thông tin múi giờ. Dễ sử dụng nhưng có thể gây nhầm lẫn nếu ứng dụng chạy trên nhiều múi giờ khác nhau.
- Aware Object: Chứa thông tin múi giờ (timezone), giúp xác định chính xác thời điểm tương đối so với UTC.
Từ Python 3.11, bạn có thể dễ dàng làm việc với múi giờ chuẩn UTC thông qua datetime.UTC hoặc lớp timezone:
from datetime import datetime, timezone, timedelta
# Lấy thời gian UTC hiện tại (Aware)
utc_now = datetime.now(timezone.utc)
print("Giờ UTC:", utc_now)
# Tạo múi giờ Việt Nam (UTC+7)
vn_timezone = timezone(timedelta(hours=7))
vn_now = datetime.now(vn_timezone)
print("Giờ Việt Nam:", vn_now)5. Ví Dụ Thực Tế: Tạo Hệ Thống Nhắc Nhở Lịch Hẹn
Dưới đây là một ví dụ kết hợp giúp bạn kiểm tra và gửi thông báo nhắc nhở trước sự kiện 30 phút:
from datetime import datetime, timedelta
def check_reminder(event_time_str):
# Parse chuỗi thời gian sự kiện
event_time = datetime.strptime(event_time_str, "%Y-%m-%d %H:%M")
# Tính thời điểm gửi nhắc nhở (trước 30 phút)
reminder_time = event_time - timedelta(minutes=30)
print(f"Thời gian sự kiện: {event_time.strftime('%d/%m/%Y %H:%M')}")
print(f"Thời gian gửi nhắc nhở: {reminder_time.strftime('%d/%m/%Y %H:%M')}")
# Kiểm tra xem đã đến lúc nhắc nhở chưa
now = datetime.now()
if now >= reminder_time and now < event_time:
print("=> CẢNH BÁO: Sắp đến giờ diễn ra sự kiện!")
elif now >= event_time:
print("=> Sự kiện đã diễn ra.")
else:
print("=> Chưa đến thời gian nhắc nhở.")
# Chạy thử nghiệm
check_reminder("2025-06-20 15:00")Kết Luận
Module datetime cung cấp đầy đủ công cụ mạnh mẽ để bạn xử lý mọi tác vụ liên quan đến ngày tháng và thời gian trong Python. Nắm vững cách chuyển đổi với strftime/strptime và tính toán khoảng thời gian bằng timedelta sẽ giúp bạn xây dựng các tính năng ứng dụng chính xác và tin cậy hơn.
Nguồn tham khảo
- Python datetime module - GeeksforGeeks
- datetime | Python Standard Library – Real Python
- datetime — Basic date and time types — Python 3.14.7 documentation
- Python Dates
- Datetime trong Python
Nhận xét
Đăng nhận xét