Hai hàm này đều chuyển tuple thời gian (struct_time) sang timestamp (giây từ epoch), nhưng giả định khác nhau về múi giờ của input.
Khác biệt cốt lõi
| Hàm | Giả định input | Mô tả |
time.mktime() | Giờ địa phương (local time) | Dùng C mktime(), phụ thuộc múi giờ hệ thống |
calendar.timegm() | Giờ UTC/GMT | Tự tính toán, không phụ thuộc múi giờ hệ thống |
Ví dụ minh họa
import calendar
import time
from datetime import datetime
dt = datetime(2017, 12, 31, 0, 0, 0) # Naive datetime
timetup = dt.timetuple()
print("time.mktime (local):", time.mktime(timetup))
print("calendar.timegm (UTC):", calendar.timegm(timetup))
Kết quả (trên máy UTC+7)
time.mktime (local): 1514658600.0
calendar.timegm (UTC): 1514678400
Chênh lệch = 19800 giây = 5.5 giờ = offset của múi giờ địa phương.
Khi nào dùng cái nào?
- time.mktime(): Khi tuple đại diện cho giờ địa phương người dùng (ví dụ: nhập từ form web).
- calendar.timegm(): Khi tuple đại diện cho giờ UTC (ví dụ: log server, API, database lưu UTC).
- Best practice: Luôn dùng datetime aware (có tzinfo) và
dt.timestamp() thay vì 2 hàm này.