CÔNG CỤ
MODULES
THAM KHẢO
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.

TimeDelta trong Python

Trong bài viết này, mình sẽ đi sâu vào cách tạo và sử dụng TimeDelta, làm thế nào để thực hiện các phép toán toán học và so sánh với TimeDelta, cùng với một số ví dụ thực tế để minh họa cách áp dụng linh hoạt của nó. Sau khi bạn hoàn thành việc đọc bài viết này, bạn sẽ có kiến thức vững chắc về cách sử dụng TimeDelta để làm việc hiệu quả với việc tính toán và quản lý thời gian trong ứng dụng Python của mình.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Hãy cùng bắt đầu hành trình tìm hiểu TimeDelta và tìm hiểu cách nó có thể làm thay đổi cách chúng ta làm việc với thời gian trong lập trình Python.

Timedelta trong Python là gì?

Timedelta trong Python là một đối tượng dùng để đại diện cho một khoảng thời gian giữa hai ngày hoặc thời điểm cụ thể.

Nó thuộc về module datetime của Python và được sử dụng để thực hiện các phép toán liên quan đến thời gian, như tính toán khoảng cách giữa các sự kiện, làm việc với các đơn vị thời gian như ngày, giờ, phút và giây, cũng như thực hiện các phép toán toán học như cộng và trừ trên các khoảng thời gian.

Bài viết này được đăng tại [free tuts .net]

from datetime import timedelta

anh11 jpg

Ví dụ : Cách tính khoảng cách thời gian giữa hai ngày tháng

from datetime import datetime

# Định nghĩa hai ngày tháng
start_date = datetime(2023, 8, 1)
end_date = datetime(2023, 8, 15)

# Tính khoảng cách thời gian
time_difference = end_date - start_date

# In ra kết quả
print(f"Khoảng cách thời gian: {time_difference}")
print(f"Số ngày: {time_difference.days} ngày")

Kết quả:

Khoảng cách thời gian: 14 days, 0:00:00
Số ngày: 14 ngày

Ở đây, mình đã sử dụng đối tượng Timedelta để tính khoảng cách thời gian giữa hai ngày tháng (end_date - start_date). Kết quả cho mình thấy rằng có 14 ngày chênh lệch giữa hai ngày đã cho.

Đối tượng thời gianDelta

Tạo đối tượng Timedelta trong Python rất linh hoạt, cho phép bạn tính toán khoảng thời gian dựa trên các đơn vị khác nhau như ngày, giây, phút, giờ, tuần, mili giây và micro giây.

Dưới đây là một ví dụ cụ thể về cách tạo đối tượng Timedelta và tính toán khoảng thời gian trong quá khứ và tương lai:

from datetime import datetime, timedelta

# Định nghĩa một ngày cụ thể
base_date = datetime(2023, 8, 1)

# Tạo các đối tượng Timedelta với các đối số khác nhau
past_timedelta = timedelta(days=15, hours=6)
future_timedelta = timedelta(weeks=3, minutes=45)

# Tính ngày trong quá khứ và tương lai
past_date = base_date - past_timedelta
future_date = base_date + future_timedelta

# In kết quả
print("Ngày trong quá khứ:", past_date)
print("Ngày trong tương lai:", future_date)

Kết quả sẽ tương tự như sau:

Ngày trong quá khứ: 2023-07-17 18:00:00
Ngày trong tương lai: 2023-08-22 00:45:00

Trong ví dụ trên, mình đã sử dụng các đối số của đối tượng Timedelta để tính toán ngày trong quá khứ và tương lai từ một ngày cụ thể (base_date). Bạn có thể thay đổi giá trị của các đối số để thay đổi khoảng thời gian tính toán.

Lưu ý:

Các giá trị được lưu trữ bên trong đối tượng Timedelta trong Python được thể hiện dưới dạng ngày, giây và micro giây. Khi bạn truyền giá trị trong bất kỳ đơn vị nào khác, nó sẽ tự động chuyển đổi sang các đơn vị này. Ví dụ, một phần nghìn giây sẽ được chuyển đổi thành 1000 giây và một tuần sẽ được chuyển đổi thành 7 ngày.

Quá trình bình thường hóa một đối tượng Timedelta thường gom nhất các giá trị đối số của nó thành ba thuộc tính chính: ngày, giây và micro giây. Việc này được thực hiện tự động trong quá trình lưu trữ của đối tượng Timedelta.

Trong quá trình gom nhất, các giá trị thường được kiểm tra để đảm bảo rằng chúng nằm trong phạm vi hợp lệ, như được đề cập trong bảng dưới đây. Nếu giá trị nằm ngoài phạm vi này, một ngoại lệ kiểu OverflowError sẽ được ném ra.

Thuộc tính Giá trị (Bao gồm giá trị tối đa và tối thiểu)
days Giữa -999999999 và 999999999
seconds Từ 0 đến 86399 (3600*24 số giây trong một ngày)
microseconds Giữa 0 và 999999

Thông tin này giúp bạn hiểu rõ hơn về cách Timedelta xử lý và biểu diễn các giá trị thời gian trong Python.

Thuộc tính TimeDelta

Thuộc tính của đối tượng Timedelta trong Python cho phép chúng ta truy cập vào các phần khác nhau của khoảng thời gian, như ngày, giây, phút và giờ.

Thuộc tính Ý nghĩa
timedelta.days Trả về ngày từ timedelta
timedelta.microseconds Trả về micro giây từ timedelta
timedelta.seconds Trả về giây từ timedelta
timedelta.max Trả về giá trị timedelta dương lớn nhất, nó sẽ làdatetime.timedelta(999999999, 86399, 999999)
timedelta.min Trả về giá trị timedelta âm nhất và giá trị của nó làdatetime.timedelta(-999999999)
timedelta.resolution Sự khác biệt nhỏ nhất có thể có giữa hai đối tượng delta thời gian không bằng nhau là 1 micro giây.
timedelta.total_seconds() Trả về tổng số giây trong khoảng thời gian

Ví dụ :

from datetime import datetime

d1 = datetime(year=2020, month=3, day=21, hour=12, minute=30)
d2 = datetime(year=2021, month=1, day=12, hour=18, minute=15)

# Get timedelta by subtracting two dates
td = d2 - d1

# access timedelta attributes
print("Days:", td.days)
print("Microseconds:", td.microseconds)
print("seconds:", td.seconds)
print("Max:", td.max)
print("Min:", td.min)
print("Resolution:", td.resolution)
print("Total Seconds:", td.total_seconds())

Kết quả:

Ngày: 297
Micro giây: 0
giây: 20700
Tối đa: 999999999 ngày, 23:59:59,999999
Tối thiểu: -999999999 ngày, 0:00:00
Độ phân giải: 0:00:00.000001
Tổng số giây: 25681500,0

TimeDelta với Tuần

Trong Python, bạn có thể sử dụng đơn vị "week" để tạo đối tượng Timedelta và thực hiện các phép toán liên quan đến khoảng thời gian theo tuần.

Dưới đây là một ví dụ về cách sử dụng đơn vị "week" với đối tượng Timedelta:

from datetime import datetime, timedelta

current_date = datetime.now()
print("Ngày và Giờ Hiện tại:", current_date)

# Trừ đi 6 tuần
past_date = current_date - timedelta(weeks=6)
print("Ngày Quá Khứ:", past_date)

# Cộng thêm 2 tuần
future_date = current_date + timedelta(weeks=2)
print("Ngày Tương Lai:", future_date)

Kết quả :

Ngày và Giờ Hiện tại: 2023-08-17 08:30:00.123456 (hoặc thời điểm hiện tại tương tự)
Ngày Quá Khứ: 2023-07-06 08:30:00.123456 (6 tuần trước thời điểm hiện tại)
Ngày Tương Lai: 2023-08-31 08:30:00.123456 (2 tuần sau thời điểm hiện tại)

TimeDelta với giây và micro giây

Mình sử dụng thuộc tính seconds mili giây của một timedelta đối tượng để tính thời gian trước hoặc sau vài giây/mili giây .

from datetime import datetime, timedelta

current_date = datetime.now()
print("Current Date and Time : ", current_date)

# add 60 seconds
future_date = current_date + timedelta(seconds=6)
print("60 seconds After: ", future_date)

# subtract 500 milliseconds
past_date = current_date - timedelta(milliseconds=500)
print("500 Milliseconds Before: ", past_date)

Kết quả dự kiến (chú ý rằng thời điểm chính xác sẽ khác nhau khi bạn chạy mã):

Ngày và Giờ Hiện tại: 2023-08-17 08:30:00.123456 (hoặc thời điểm hiện tại tương tự)
Sau 60 giây: 2023-08-17 08:31:00.123456 (60 giây sau thời điểm hiện tại)
Trước 500 mili giây: 2023-08-17 08:29:59.623456 (500 mili giây trước thời điểm hiện tại)

TimeDelta sang Giây

Một đối tượng Timedelta trong Python cung cấp phương thức total_seconds() để tính tổng số giây trong khoảng thời gian đó. Kết quả trả về là một giá trị số dấu phẩy động chính xác đến micro giây. Tuy nhiên, khi xử lý các khoảng thời gian lớn, ví dụ như 270 năm, phương thức này có thể mất mát độ chính xác của phần triệu giây.

Do đó, phương pháp total_seconds() thường được ưa chuộng để chuyển đổi đối tượng Timedelta thành một số dấu phẩy động, nhưng nên cẩn trọng khi sử dụng cho các khoảng thời gian lớn.

Nói cách khác, phương pháp total_seconds() là cách tiện lợi để tính số giây từ một đối tượng Timedelta, nhưng nếu bạn cần độ chính xác cao với các khoảng thời gian lớn, bạn nên xem xét các phương pháp khác như làm việc trực tiếp với các thành phần ngày, giây và micro giây của đối tượng Timedelta.

from datetime import timedelta

td = timedelta(minutes=5)
print("Number of seconds in timedelta:", td.total_seconds())

# Output 300.0

Time Delta với ngày và giờ

Mình có thể dự đoán ngày trong tương lai và ngày trong quá khứ bằng cách thêm hoặc trừ một khoảng thời gian từ ngày hiện tại, bằng cách cung cấp số ngày mong muốn cho đối tượng Timedelta.

from datetime import datetime, timedelta

current_date = datetime.now()
print("Current Date and Time : ", current_date)

# add 100 days
future_date = current_date + timedelta(days=100)
print("Date 100 days later: ", future_date)

# subtract 100 days
past_date = current_date - timedelta(days=100)
print("Date 100 days before: ", past_date)

Kết quả:

Ngày và Giờ Hiện tại: 2023-08-17 08:30:00.123456 (hoặc thời điểm hiện tại tương tự)
Ngày 100 ngày sau: 2023-11-25 08:30:00.123456
Ngày 100 ngày trước: 2023-05-09 08:30:00.123456

TimeDelta với Giờ

Mình có thể tính thời gian trước hoặc sau thời điểm hiện tại bằng cách sử dụng đối tượng Timedelta với số giờ cụ thể.

from datetime import datetime, timedelta

# Lấy thời điểm hiện tại
current_time = datetime.now()
print("Thời gian Hiện tại:", current_time)

# Số giờ mong muốn trước và sau
hours_before = 2
hours_after = 3

# Tính thời gian trước và sau bằng cách thêm/trừ đối tượng Timedelta
time_before = current_time - timedelta(hours=hours_before)
time_after = current_time + timedelta(hours=hours_after)

# In kết quả
print(f"{hours_before} giờ trước: {time_before}")
print(f"{hours_after} giờ sau: {time_after}")

Kêt quả:

Thời gian Hiện tại: 2023-08-17 08:30:00.123456 (hoặc thời điểm hiện tại tương tự)
2 giờ trước: 2023-08-17 06:30:00.123456
3 giờ sau: 2023-08-17 11:30:00.123456

Cộng hoặc trừ hai đối tượng timedelta.

Trong quá trình tính toán sự khác biệt giữa hai ngày, ta có thể sử dụng đối tượng timedelta để biểu thị khoảng thời gian bằng cách cộng hoặc trừ chúng. Bằng cách trừ hai đối tượng timedelta, mình có thể tính toán sự chênh lệch thời gian giữa chúng.

Hãy xem ví dụ sau để hiểu rõ hơn:

from datetime import datetime, timedelta

# Lấy thời điểm hiện tại
current_time = datetime.now()
print("Thời gian Hiện tại:", current_time)

# Tạo các đối tượng timedelta biểu thị khoảng thời gian
time_difference_1 = timedelta(weeks=2, days=2, hours=12, minutes=30)
time_difference_2 = timedelta(weeks=1, days=1, hours=11, minutes=30)

# Tính toán sự khác biệt giữa hai đối tượng timedelta
time_difference = time_difference_1 - time_difference_2

# Lấy thời điểm mới cách ngày hiện tại theo khoảng thời gian tính toán
new_time = current_time + time_difference

# In kết quả
print("Sự khác biệt thời gian:", time_difference)
print("Thời gian mới:", new_time)

Kết quả:

Thời gian Hiện tại: 2023-08-17 08:30:00.123456 (hoặc thời điểm hiện tại tương tự)
Sự khác biệt thời gian: 7 days, 1:00:00
Thời gian mới: 2023-08-24 09:30:00.123456

Ngoài việc thực hiện phép cộng và phép trừ giữa hai đối tượng Timedelta, mình còn có thể thực hiện các thao tác sau với chúng:

  • Nhân với giá trị dấu phẩy động: Chúng ta có thể nhân một đối tượng Timedelta với một số nguyên hoặc số thực. Kết quả của phép nhân sẽ được làm tròn đến bội số gần nhất của timedelta.resolution.

  • Phép toán modulo: Mình có thể sử dụng phép toán modulo (%) với hai đối tượng Timedelta. Kết quả của phép toán modulo sẽ là một đối tượng Timedelta biểu thị phần còn lại sau khi chia hai khoảng thời gian.

Dưới đây là cách thực hiện hai thao tác này:

from datetime import timedelta

# Tạo một đối tượng timedelta
time_difference = timedelta(days=5, hours=3, minutes=30)

# Nhân với giá trị dấu phẩy động
multiplied_timedelta = time_difference * 1.5  # Nhân với 1.5

# Thực hiện phép toán modulo
other_timedelta = timedelta(days=2, hours=2, minutes=15)
modulo_result = time_difference % other_timedelta

# In kết quả
print("Đối tượng Timedelta ban đầu:", time_difference)
print("Sau khi nhân:", multiplied_timedelta)
print("Kết quả phép toán modulo:", modulo_result)

Kết quả:

Đối tượng Timedelta ban đầu: 5 days, 3:30:00
Sau khi nhân: 7 days, 10:30:00
Kết quả phép toán modulo: 2 days, 1:15:00

Định dạng Timedelta

Sau khi tính toán khoảng thời gian trong tương lai hoặc quá khứ bằng cách sử dụng đối tượng Timedelta, chúng ta có thể sử dụng hàm strftime() để định dạng timedelta và hiển thị nó theo định dạng mong muốn.

from datetime import datetime, timedelta

# Tính toán khoảng thời gian ở tương lai và quá khứ
future_date = datetime.now() + timedelta(days=10, hours=5, minutes=30)
past_date = datetime.now() - timedelta(days=5, hours=2, minutes=15)

# Định dạng và hiển thị khoảng thời gian
future_formatted = future_date.strftime("%Y-%m-%d %H:%M:%S")
past_formatted = past_date.strftime("%Y-%m-%d %H:%M:%S")

# In kết quả
print("Ngày trong tương lai định dạng:", future_formatted)
print("Ngày trong quá khứ định dạng:", past_formatted)

Kết quả:

Ngày trong tương lai định dạng: 2023-08-27 16:45:00
Ngày trong quá khứ định dạng: 2023-08-12 06:15:00

Kết bài

Trong bài viết này, mình đã tìm hiểu về đối tượng Timedelta trong Python và cách sử dụng nó để thực hiện các tính toán về khoảng thời gian.Mình đã khám phá cách tạo đối tượng Timedelta bằng cách cung cấp các đối số như ngày, giây, phút, giờ, tuần, mili giây và micro giây.

Ta đã thấy cách tính toán sự chênh lệch thời gian giữa hai ngày, và cách thực hiện các phép cộng, trừ, nhân và phép toán modulo với các đối tượng Timedelta. Điều này cho phép ta thực hiện các tính toán phức tạp liên quan đến thời gian một cách dễ dàng.

Cuối cùng, mình đã tìm hiểu cách định dạng đối tượng Timedelta và hiển thị nó theo định dạng mong muốn bằng cách sử dụng hàm strftime().

Hi vọng rằng thông qua bài viết này, bạn đã có cái nhìn tổng quan về cách sử dụng đối tượng Timedelta để làm việc với khoảng thời gian trong Python. Điều này sẽ giúp bạn thực hiện các tính toán thời gian và xử lý các vấn đề liên quan đến thời gian một cách hiệu quả.

Cùng chuyên mục:

Phạm vi số float của Python

Phạm vi số float của Python

Bài tập Python : Pandas trong Python

Bài tập Python : Pandas trong Python

Hướng dẫn kết nối Python PostgreSQL bằng Psycopg2

Hướng dẫn kết nối Python PostgreSQL bằng Psycopg2

Kết nối cơ sở dữ liệu MySQL Python

Kết nối cơ sở dữ liệu MySQL Python

Bài tập Python: Lập trình cơ sở dữ liệu trong Python

Bài tập Python: Lập trình cơ sở dữ liệu trong Python

Tạo số ngẫu nhiên trong một phạm vi bằng Python

Tạo số ngẫu nhiên trong một phạm vi bằng Python

Bài tập Python : Tạo dữ liệu ngẫu nhiên trong Python

Bài tập Python : Tạo dữ liệu ngẫu nhiên trong Python

Bài tập Python : Matplotlib trong Python

Bài tập Python : Matplotlib trong Python

Bài tập Python: NumPy trong Python

Bài tập Python: NumPy trong Python

Bài tập Python: JSON trong Python

Bài tập Python: JSON trong Python

Bài tập Python: Lập trình hướng đối tượng (OOP) trong Python

Bài tập Python: Lập trình hướng đối tượng (OOP) trong Python

Chuyển chuỗi Python thành DateTime trong Python

Chuyển chuỗi Python thành DateTime trong Python

Bài tập Python: DateTime trong Python

Bài tập Python: DateTime trong Python

Bài tập Python: Tuple trong Python

Bài tập Python: Tuple trong Python

Bài tập Python: Set trong Python

Bài tập Python: Set trong Python

Bài tập Python: Dictionary trong Python

Bài tập Python: Dictionary trong Python

Bài tập Python: List trong Python

Bài tập Python: List trong Python

Bài tập Python: Cấu trúc dữ liệu trong Python

Bài tập Python: Cấu trúc dữ liệu trong Python

Bài tập Python: Chuỗi trong Python

Bài tập Python: Chuỗi trong Python

Bài tập Python: Hàm trong Python

Bài tập Python: Hàm trong Python

Top