Một điểm khác biệt chính không được làm nổi bật trong các câu trả lời khác là sự hiện diện của danh từ số ít và số nhiều cho mỗi sự khác biệt thời gian nguyên thủy. Trong khi timedelta
chỉ cung cấp danh từ số nhiều (ví dụ hours
, days
) để biểu thị sự khác biệt về thời gian tương đối, relativedelta
cung cấp danh từ số ít (ví dụ hour
, day
) để biểu thị thông tin thời gian tuyệt đối.
Điều này rõ ràng từ định nghĩa của 2 lớp:
Definition: datetime.timedelta([days[, seconds[, microseconds[,
milliseconds[, minutes[, hours[, weeks]]]]]]])
Definition: relativedelta.relativedelta(self, dt1=None, dt2=None,
years=0, months=0, days=0, leapdays=0, weeks=0, hours=0, minutes=0,
seconds=0, microseconds=0, year=None, month=None, day=None,
weekday=None, yearday=None, nlyearday=None, hour=None, minute=None,
second=None, microsecond=None)
Bây giờ, chính xác thì dạng số ít làm gì? Dạng số ít tạo ra một delta khi được thêm vào một datetime
đối tượng, đặt ngày / giờ cụ thể đó trong datetime
đối tượng thành được đề cập trong relativedelta
. Đây là một ví dụ nhỏ:
>>> import datetime as dt; from dateutil.relativedelta import *
>>> NOW = dt.datetime(2018, 11, 17, 9, 6, 31)
>>> NOW
datetime.datetime(2018, 11, 17, 9, 6, 31)
>>> NOW + relativedelta(hours=1)
datetime.datetime(2018, 11, 17, 10, 6, 31)
>>> NOW + relativedelta(hour=1)
datetime.datetime(2018, 11, 17, 1, 6, 31)
Điều này có thể dẫn đến relativedelta
việc được sử dụng cho một số ứng dụng thú vị, có thể phức tạp để triển khai sử dụng timedelta
. Một điều mà bạn nhanh chóng nghĩ đến là làm tròn số.
Một ứng dụng thú vị: Nhanh chóng làm tròn
Bây giờ tôi sẽ chỉ cho bạn cách relativedelta
biểu cảm hơn khi làm tròn một datetime
đối tượng đến phút, giờ, ngày, v.v.
Làm tròn đến giờ gần nhất:
Lưu ý rằng nó đơn giản như thế nào khi sử dụng relativedelta
:
NOW + relativedelta(hours=1, minute=0, second=0, microsecond=0)
dt.combine(NOW.date(),dt.time(NOW.hour,0,0)) + dt.timedelta(0,60*60,0)
Các quy tắc làm tròn phức tạp khác có thể dễ dàng đạt được bằng cách sử dụng relativedelta
. Tuy nhiên, lưu ý rằng tất cả các vòng lặp có thể được thực hiện bởi relativedelta
cũng có thể được thực hiện bằng cách sử dụng các datetime
hàm và timedelta
chỉ theo một cách phức tạp hơn một chút.
dateime.timedelta
sẽ đạt được những gì bạn muốn và tránh phụ thuộc vàodateutil
gói bên ngoài .