Học bằng cách đọc theo thứ tự

datetime và time — Làm việc với ngày, giờ, và thời gian trôi qua

Học các module datetime / time / calendar của Python từ căn bản. Phủ số học ngày với date / datetime / timedelta, chuyển chuỗi qua strftime / strptime, và đo thời gian trôi qua với time.perf_counter — đều có thực hành.

Bài này đi qua 3 thư viện chuẩn xử lý ngày, giờ, và thời gian trôi quadatetime / time / calendar. Bạn sẽ thấy số học ngày với date / datetime / timedelta, chuyển chuỗi hai chiều với strftime / strptime, và đo thời gian trôi qua với time.perf_counter.

date / datetime / timedelta — Tạo ngày và tính khoảng cách

Khi bạn làm việc với ngày trong Python, bạn chọn từ 3 class trong module datetime. date chỉ giữ năm/tháng/ngày, datetime thêm giờ/phút/giây, và timedelta đại diện cho một khoảng thời gian như "3 ngày" hoặc "2 giờ". Thiết kế đối xứng: date + timedelta cho bạn "3 ngày từ giờ", và date - date trả về khoảng cách giữa hai ngày dưới dạng timedelta.

date / datetime / timedelta liên hệ ra sao
datenăm / tháng / ngàydatetimenăm/tháng/ngày + giờtimedeltakhoảng (gap / offset)
date và datetime đại diện cho điểm thời gian; timedelta đại diện cho khoảng cách giữa chúng hoặc lượng để thêm.
ClassLưu gìDùng điển hình
datenăm / tháng / ngàySinh nhật, ngày đặt — bất cứ gì chỉ ngày quan trọng
datetimenăm / tháng / ngày + giờ / phút / giâyLog, thời gian sửa file — bất cứ gì giờ cũng quan trọng
timedeltangày / giây / microgiây"3 ngày từ giờ", "thời gian trôi qua" — khoảng thời gian
timegiờ / phút / giây (không có ngày)Chỉ giờ trong ngày, ví dụ "giờ làm việc 9:00 đến 18:00"
Làm số học ngày với thư viện datetime
date(2024, 3, 15)tạo+ timedelta(days=3)date(2024, 3, 18)kết quả+ timedelta= date mới
date + timedelta cho bạn một date mới. Hiệu date2 - date1 trả về một timedelta.
from datetime import date, datetime, timedelta

# Tạo một ngày
order_date = date(2024, 3, 15)
print(order_date)            # 2024-03-15

# Ba ngày sau
delivery = order_date + timedelta(days=3)
print(delivery)              # 2024-03-18

# Khoảng cách giữa hai ngày là một timedelta
elapsed = delivery - order_date
print(elapsed.days)          # 3

# Thời gian hiện tại
now = datetime.now()
print(now.year, now.month, now.day)

datetime.now và phụ thuộc môi trường

datetime.now() trả về thời gian hiện tại của máy đang chạy code, nên giá trị thay đổi mỗi lần chạy dù bạn ở runtime Pyodide trình duyệt hay máy thật. Bài tập thực hành dùng date(2024, 3, 15) cố định để giữ tính tái lập — thử now() riêng trong console để xem hành vi của nó.

Tính ngày giao (3 ngày sau) và hạn thanh toán (14 ngày sau) từ ngày đặt 2024-03-15.

① Hãy import datetimedelta từ datetime, rồi xây ngày đặt date(2024, 3, 15).

② Hãy tính ngày giao = ngày đặt + timedelta(days=3) và hạn thanh toán = ngày đặt + timedelta(days=14).

③ Hãy in cả hai dạng Ship date: ...Pay due: ....

Python Editor

Chạy code để xem đầu ra

Tính khoảng cách giữa hai ngày

Trừ một ngày từ ngày khác trả về một đối tượng timedelta. Thuộc tính .days cho bạn chỉ số ngày, nên câu hỏi như "còn bao nhiêu ngày đến X?" có câu trả lời số nguyên gọn gàng.

Tính bao nhiêu ngày tách ngày giao và hạn thanh toán từ Thực hành 1.

① Hãy tạo lại cùng ngày đặt, ngày giao, và hạn thanh toán như Thực hành 1.

② Hãy tính pay_due - ship_date để có timedelta, rồi đọc thuộc tính .days của nó.

③ Hãy in số ngày dưới dạng Interval: ... days.

Python Editor

Chạy code để xem đầu ra

strftime / strptime — Chuyển giữa ngày và chuỗi

Ngày bên trong file, log, hoặc JSON gần như luôn đến dưới dạng chuỗi. Trong Python, strftime (format time) chuyển datetime → chuỗi, và strptime (parse time) chuyển chuỗi → datetime. Cả hai nhận một format code ánh xạ ký hiệu sang ý nghĩa — %Y là năm 4 chữ số, %m là tháng 2 chữ số, v.v.

Tính đối xứng của strftime và strptime
datetimeobjectstring'2024-03-15'format code như %Y-%m-%ddatetimeobjectstring'2024-03-15'strftime (format)strptime (parse)
strftime viết một datetime ra dùng chuỗi format; strptime đọc một chuỗi vào lại với cùng format. f là cho format, p là cho parse. Format code (%Y, %m, %d, v.v.) được chia sẻ giữa hai cái.
Format codeÝ nghĩaVí dụ
%YNăm 4 chữ số2024
%mTháng 2 chữ số (01-12)03
%dNgày 2 chữ số (01-31)15
%HGiờ 24h 2 chữ số (00-23)14
%MPhút 2 chữ số (00-59)30
%SGiây 2 chữ số (00-59)00
%ATên thứ trong tuần (tiếng Anh)Friday
%wSố thứ trong tuần (0=CN, 6=T7)5
from datetime import datetime

# string -> datetime
text = "2024-03-15 14:30:00"
dt = datetime.strptime(text, "%Y-%m-%d %H:%M:%S")
print(dt.year, dt.month, dt.day)   # 2024 3 15

# datetime -> string
dt2 = datetime(2024, 3, 15, 14, 30)
print(dt2.strftime("%Y/%m/%d"))               # 2024/03/15
print(dt2.strftime("%Y-%m-%d %H:%M"))          # 2024-03-15 14:30

Format không khớp raise ValueError

Nếu dấu phân tách trong chuỗi của bạn không khớp format code — ví dụ strptime("2024/03/15", "%Y-%m-%d") — bạn nhận ValueError. Nhìn format thực tế của input và canh dấu gạch ngang với gạch ngang, slash với slash. Cho chuỗi kiểu ISO như "2024-03-15T14:30:00" trộn dấu gạch với T và colon, datetime.fromisoformat(text) dễ hơn.

Chuyển chuỗi log timestamp "2024-03-15 14:30:45" thành đối tượng datetime, rồi reformat khác.

① Hãy import class datetime từ module datetime.

② Hãy lưu chuỗi timestamp ở trên trong một biến.

③ Hãy parse chuỗi thành đối tượng datetime (format code phản chiếu bố cục của input). Rồi in Type: datetime dùng type(value).__name__.

④ Hãy lấy năm, tháng, và ngày từ datetime dưới dạng thuộc tính (d.year / d.month / d.day) và in chúng dạng Year: ... Month: ... Day: ....

⑤ Hãy format cùng datetime thành năm/tháng/ngày giờ:phút (bỏ giây). In kiểu giá trị đã format dạng Formatted type: str với type(formatted).__name__, rồi in giá trị dạng Formatted: ... (xác nhận đã đi datetime → str).

Python Editor

Chạy code để xem đầu ra

time và calendar — Đo thời gian trôi qua và kiểm tra tháng

Module time tách biệt khỏi datetime và expose API thời gian cấp thấp hơn. Cái bạn sẽ với tới nhiều nhất là time.perf_counter(), một counter độ phân giải cao trả về thời gian trôi qua hiện tại theo giây (dạng float). Gọi nó hai lần — trước và sau — và hiệu là thời gian thực thi của bạn. Module calendar lấy thông tin lịch như một tháng có bao nhiêu ngày hoặc thứ trong tuần của ngày 1 tháng.

Khi nào dùng time.time vs time.perf_counter
time.time()Unix timestamp (giây)time.perf_counter()counter monotoniclog timestampkhi thời gian tuyệtđối quan trọngđo thời gian thực thikhi thời gian tương đối đủ
time.time trả về giây từ 1970-01-01 00:00 UTC (Unix timestamp). time.perf_countercounter monotonic độ chính xác cao với điểm 0 không xác định — hoàn hảo để đo thời gian trôi qua.
HàmTrả vềTrường hợp dùng
time.time()Unix timestamp (float)Timestamp thời gian hiện tại
time.perf_counter()counter monotonic (float, giây)Đo thời gian thực thi
calendar.monthrange(y, m)Tuple (thứ của ngày 1, ngày cuối)Thông tin lịch tháng
calendar.isleap(y)True / FalseKiểm tra năm nhuận
import time
import calendar

# Đo thời gian thực thi
start = time.perf_counter()
total = sum(range(100000))
elapsed = time.perf_counter() - start
print("Total:", total)
print("Type:", type(elapsed).__name__)   # float

# Thông tin lịch
weekday, last_day = calendar.monthrange(2024, 2)   # (thứ của ngày 1, ngày cuối)
print("Last day of Feb 2024:", last_day)
print("Leap year:", calendar.isleap(2024))

Vì sao dùng perf_counter thay vì time.time

time.time() trả về Unix timestamp (giây với phần lẻ), nhưng nếu đồng hồ máy bị NTP điều chỉnh lùi, hiệu có thể âm. time.perf_counter() đảm bảo monotonic (luôn tăng)được thiết kế riêng cho đo thời gian trôi qua, nên cho timing kiểu stopwatch nó là lựa chọn đúng mỗi lần.

Kết hợp đo thời gian trôi qua với thông tin tháng.

① Hãy import time và calendar.

② Hãy bắt đầu stopwatch (dùng counter độ chính xác cao cho thời gian trôi qua).

③ Hãy tính tổng các số nguyên từ 0 đến 49999.

④ Hãy tính thời gian trôi qua và in Total: ...Elapsed >= 0 seconds: True (thời gian thực tế thay đổi theo môi trường, nên ta chỉ xác nhận nó không âm).

⑤ Hãy in ngày cuối của tháng 2 năm 2024 dưới dạng Feb end: ... days và kiểm tra năm nhuận dạng Leap year: True / False.

Python Editor

Chạy code để xem đầu ra

time.sleep — Tạm dừng cho khoảng thời gian định

`time.sleep(seconds)` là hàm tạm dừng thực thi cho số giây đã cho. Nó xuất hiện ở khắp nơi — khoảng thời gian retry, rate limiting, timing animation. Tham số là float, nên bạn có thể truyền phân số như time.sleep(0.5). Vì những bài tập này chạy trên trình duyệt, giữ sleep ngắn (0–1 giây) để xác minh hành vi.

Dừng thực thi với `time.sleep` và kiểm tra xem thời gian trôi qua có ít nhất 0.3 giây không. Thời gian thực tế lắc lư một chút theo môi trường, nên ta xác minh nó dưới dạng boolean — nó có ít nhất 0.3 giây không?

① Hãy import time.

② Hãy ghi thời gian bắt đầu với time.perf_counter().

③ Hãy chờ 0.3 giây với time.sleep(0.3).

④ Hãy tính thời gian trôi qua dưới dạng time.perf_counter() - start_time và in Elapsed >= 0.2 seconds: True / False dùng >= 0.2.

(Nếu chạy đúng phần giải thích sẽ xuất hiện bên dưới.)

Python Editor

Chạy code để xem đầu ra
QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1Kết hợp nào tính "3 ngày từ giờ"?

Câu 2Chuỗi format nào chuyển chuỗi "2024/03/15" thành datetime?

Câu 3Cái nào tốt nhất để đo thời gian thực thi?

Câu 4Cách đơn giản nhất để chuyển chuỗi ISO 8601 "2024-03-15T14:30:00" thành datetime là gì?