Xử lý thời gian trong Python: Tại sao bạn nên dùng Pendulum thay vì Datetime?

Python tutorial - IT technology blog
Python tutorial - IT technology blog

Bối cảnh: Tại sao module datetime mặc định là chưa đủ?

Xử lý múi giờ (timezone) với module datetime mặc định của Python thường là trải nghiệm khá khó chịu. Bạn phải vật lộn với pytz, loay hoay chuyển đổi giữa UTC và giờ Việt Nam (ICT), rồi lại rối não với các object timedelta phức tạp.

Khi dự án của mình tăng quy mô từ 200 lên hơn 2.000 dòng code, sự cố bắt đầu xảy ra. Chỉ cần sai lệch 1 giờ do Daylight Saving Time (giờ mùa hè) hoặc lỗi định dạng chuỗi cũng đủ làm hỏng cả một pipeline dữ liệu quan trọng. Để giải quyết triệt để, mình đã chuyển sang dùng Pendulum.

Pendulum là thư viện kế thừa hoàn toàn từ datetime nhưng thông minh hơn nhiều. Nó giúp code sạch, dễ đọc và loại bỏ hầu hết các lỗi ngớ ngẩn liên quan đến thời gian.

Cài đặt Pendulum

Bạn có thể cài đặt thư viện này chỉ với một dòng lệnh duy nhất:

pip install pendulum

Sau khi cài xong, hãy thử import vào script để bắt đầu trải nghiệm sự khác biệt.

Cấu hình và sử dụng thực tế

1. Khởi tạo thời gian trong nháy mắt

Pendulum cung cấp các phương thức rất trực quan, không cần nhớ quá nhiều hàm bổ trợ. Bạn muốn lấy giờ hiện tại ở một múi giờ cụ thể? Hãy nhìn cách nó hoạt động:

import pendulum

# Lấy giờ hiện tại tại Hồ Chí Minh
now_in_vn = pendulum.now('Asia/Ho_Chi_Minh')
print(f"Giờ hiện tại ở VN: {now_in_vn}")

# Lấy giờ hiện tại UTC
now_utc = pendulum.now('UTC')

# Khởi tạo một ngày cụ thể (mặc định là UTC)
dt = pendulum.datetime(2023, 10, 25, 14, 30)
print(dt.timezone.name) 

2. Parsing – Đọc hiểu mọi định dạng chuỗi

Việc convert từ String sang Datetime thường gây phiền toái. Với datetime.strptime(), bạn phải nhớ chính xác các ký tự format như %Y-%m-%d %H:%M:%S. Pendulum tự động hóa việc này một cách thông minh.

# Tự động nhận diện định dạng ISO 8601 và các chuẩn phổ biến
dt = pendulum.parse('2023-12-25 18:00:00')
print(dt.to_date_string()) # Output: 2023-12-25

# Xử lý chuỗi có kèm múi giờ phức tạp
dt_with_tz = pendulum.parse('2023-12-25T18:00:00+07:00')
print(dt_with_tz.timezone_name) # Output: Asia/Ho_Chi_Minh

3. Tính toán thời gian theo phong cách ngôn ngữ tự nhiên

Điểm cộng lớn nhất là khả năng cộng trừ thời gian cực kỳ mạch lạc. Bạn sẽ không cần tạo object timedelta rườm rà nữa.

dt = pendulum.now()

# Cộng 1 tuần, trừ 2 ngày bằng cách nối chuỗi hàm (Fluent Interface)
future = dt.add(weeks=1).subtract(days=2)

# Tìm mốc thời gian biên
end_of_month = dt.end_of('month')
start_of_year = dt.start_of('year')

print(f"Ngày cuối tháng này: {end_of_month.to_date_string()}")

4. Diff for Humans – Hiển thị thời gian thân thiện

Nếu bạn làm ứng dụng mạng xã hội hoặc log hệ thống, tính năng diff_for_humans() là trợ thủ đắc lực. Thay vì hiển thị con số khô khan, nó trả về các cụm từ như “2 giờ trước”.

past = pendulum.now().subtract(minutes=45)

# Hỗ trợ đa ngôn ngữ, bao gồm tiếng Việt
print(past.diff_for_humans(locale='vi')) # Output: 45 phút trước

Bài học xương máu từ dự án thực tế

Mình từng gặp một bug khá “khoai”: Hệ thống gửi email báo cáo vào 3 giờ sáng thay vì 8 giờ sáng. Nguyên nhân do server Docker chạy giờ UTC, trong khi logic code lấy giờ hệ thống mà không chỉ định múi giờ rõ ràng.

Để khắc phục, hãy luôn áp dụng quy tắc: “Internal UTC, External Local”. Lưu trữ và tính toán mọi thứ ở chuẩn UTC, chỉ dùng Pendulum để convert sang giờ địa phương khi hiển thị cho người dùng.

def get_report_time(user_timezone):
    # Luôn lấy giờ gốc là UTC để tránh sai lệch cấu hình server
    now_utc = pendulum.now('UTC')
    
    # Chỉ chuyển đổi sang múi giờ người dùng khi cần thiết
    return now_utc.in_timezone(user_timezone)

# Log dữ liệu kèm múi giờ rõ ràng
user_tz = 'Asia/Ho_Chi_Minh'
print(f"[LOG] Báo cáo tạo lúc: {get_report_time(user_tz).to_datetime_string()} ({user_tz})")

Ngoài ra, Pendulum xử lý Daylight Saving Time (DST) rất chuẩn xác. Khi bạn cộng thêm thời gian vào thời điểm chuyển giao giờ mùa hè, thư viện sẽ tự động điều chỉnh kim giờ. Đây là điều mà timedelta của Python thường xuyên làm sai nếu thiếu cấu hình thủ công.

Tóm lại, nếu muốn viết code chuyên nghiệp và dễ bảo trì, hãy dùng Pendulum. Nó giúp bạn tập trung vào logic nghiệp vụ thay vì tốn thời gian tra cứu bảng mã định dạng ngày tháng.

Share: