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 timedeltachỉ 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, relativedeltacung 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 relativedeltaviệ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 relativedeltabiể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 relativedeltacũng có thể được thực hiện bằng cách sử dụng các datetimehàm và timedeltachỉ theo một cách phức tạp hơn một chút.
dateime.timedeltasẽ đạt được những gì bạn muốn và tránh phụ thuộc vàodateutilgói bên ngoài .