Tôi đang cố gắng thực hiện một số toán học ngày và timedelta và vấp phải điều này.Hành vi đáng ngạc nhiên của ngày Python và phép trừ timedelta
>>> import datetime
>>> dt = datetime.date(2000, 4, 20)
>>> td = datetime.timedelta(days=1)
>>> dt - td
datetime.date(2000, 4, 19)
>>> -(td) + dt
datetime.date(2000, 4, 19)
>>> dt - td == dt + (-td)
True
Cho đến nay rất tốt, nhưng khi timedelta cũng bao gồm một số giờ nó trở nên thú vị.
>>> td = datetime.timedelta(days=1, hours=1)
>>> dt - td
datetime.date(2000, 4, 19)
>>> -(td) + dt
datetime.date(2000, 4, 18)
hoặc trong một so sánh:
>>> dt - td == dt + (-td)
False
tôi lại có thể ngờ rằng a - b == a + (-b), nhưng điều này dường như không làm việc cho ngày và timedelta. Theo như tôi đã có thể theo dõi điều đó, điều này xảy ra vì việc cộng/trừ ngày và timedelta chỉ xem trường ngày là timedelta, điều này có thể đúng. Tuy nhiên, việc phủ nhận timedelta sẽ xem xét tất cả các trường và cũng có thể thay đổi trường ngày.
>>> -datetime.timedelta(days=1)
datetime.timedelta(-1)
>>> -datetime.timedelta(days=1, hours=1)
datetime.timedelta(-2, 82800)
Như có thể thấy trong ví dụ thứ hai, ngày = -2 sau khi phủ định, và do đó ngày + timedelta sẽ thực sự trừ 2 ngày.
Điều này có nên được coi là lỗi trong mô-đun python datetime không? Hay liệu đây có phải là hành vi 'bình thường' mà cần được tính đến khi làm những việc như thế không?
Bên trong datetime mô-đun tạo ra một mới timedelta, chỉ với những ngày lĩnh vực bản gốc timedelta đối tượng thông qua tại, khi đã trừ một timedelta đến một ngày đối tượng. Mà tương đương với sau, mã mà có vẻ là khá kỳ quặc.
>>> dt + datetime.timedelta(-(-(-dt).days))
datetime.date(2000, 4, 18)
tôi có thể không thực sự biển một lý do để chỉ sử dụng các lĩnh vực ngày phủ nhận khi làm ngày - timedelta bớt.
Edit:
Đây là con đường mã có liên quan trong python datetime mô-đun:
class date:
...
def __sub__(self, other):
"""Subtract two dates, or a date and a timedelta."""
if isinstance(other, timedelta):
return self + timedelta(-other.days)
...
Nếu nó sẽ chỉ cần vượt qua trên -Các sau đó điều kiện a - b = = a + (-b) sẽ đúng. (Nó sẽ thay đổi hành vi hiện tại mặc dù).
class date:
...
def __sub__(self, other):
"""Subtract two dates, or a date and a timedelta."""
if isinstance(other, timedelta):
return self - other # timedelta.__rsub__ would take care of negating other
...
Tôi nghĩ rằng nó có giá trị hỏi ý nghĩa của việc thêm/bớt _hours_ đến một 'date'. Nếu giờ là 24, thì bạn sẽ dễ dàng quyết định rằng bạn phải thêm 1 ngày. Nếu chưa đầy 24 giờ, bạn có nâng cấp kết quả thành 'datetime' khi bạn bắt đầu với' ngày' hay bạn tiếp tục làm việc với 'date' và cắt ngắn? – mgilson
Vâng, đó là một câu hỏi hay và câu hỏi không thể trả lời dễ dàng. Nhưng điều tôi muốn nhấn mạnh là, hoạt động toán học bình thường như * a - b == a + (-b) * không hoạt động như mong đợi. – gweis
Có, đã khắc phục điều đó. cảm ơn. – gweis