2012-09-16 42 views
23

Từ:Làm thế nào để thêm delta vào python datetime.time?

http://docs.python.org/py3k/library/datetime.html#timedelta-objects

A timedelta object represents a duration, the difference between two dates or times.

Vậy tại sao tôi nhận được lỗi với điều này:

>>> from datetime import datetime, timedelta, time 
>>> datetime.now() + timedelta(hours=12) 
datetime.datetime(2012, 9, 17, 6, 24, 9, 635862) 
>>> datetime.now().date() + timedelta(hours=12) 
datetime.date(2012, 9, 16) 

>>> datetime.now().time() + timedelta(hours=12) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta' 

Trả lời

35

datetime.time đối tượng không hỗ trợ bổ sung với datetime.timedelta s.

Tuy nhiên, có một định nghĩa tự nhiên, số học đồng hồ. Bạn có thể tính toán nó như thế này:

import datetime as dt 
now = dt.datetime.now() 
delta = dt.timedelta(hours = 12) 
t = now.time() 
print(t) 
# 12:39:11.039864 

print((dt.datetime.combine(dt.date(1,1,1),t) + delta).time()) 
# 00:39:11.039864 

dt.datetime.combine(...) thang máy các datetime.time t đến một đối tượng datetime.datetime, sau đó vùng đồng bằng được thêm vào, và kết quả là giảm trở lại xuống đến một đối tượng datetime.time.

+9

Đó là rất nhiều công việc. Tôi chỉ muốn tính toán time shift, python :). tuy nhiên đó là giải pháp, cảm ơn. – xliiv

+0

Một điều cần lưu ý ở đây là nếu 't' nhỏ hơn' delta', thì bạn sẽ kết thúc bằng 'dt.date (1,1,0)', là một giá trị ngày 'OverflowError: nằm ngoài phạm vi '. Một cách để tiếp cận điều này là tăng giá trị trong 'dt.date (...)'. Nhưng đây vẫn là một vấn đề cần phải cẩn thận. – Akavall

2

Làm thế nào sẽ làm việc này? datetime.datetime.now().time() chỉ trả lại giờ, phút, giây, v.v., không có thông tin về ngày trả về .time(), chỉ thời gian.

Sau đó, điều gì nên 18:00:00 + 8 hours trở lại?
Không có câu trả lời cho câu hỏi đó, và đó là lý do tại sao bạn không thể thêm thời gian và timedelta.

Nói cách khác:

18:28:44, Sep. 16, 2012 + 8 hours #makes sense: it's 2:28:44, Sep. 17, 2012 
18:28:44 + 5 hours # Doesn't make sense. 
+1

Trong khi điểm chung của bạn là chính xác, 6 giờ chiều + 5 giờ = 11 giờ chiều, vì vậy đó là một ví dụ không đúng và '.time()' không trả về dấu thời gian - dấu thời gian thường bao gồm đủ thông tin để lấy được ngày, một đối tượng 'datetime.time' thì không. – agf

+0

@agf, vâng, tôi đã chỉnh sửa bài đăng của mình thực sự:). Tôi cũng sẽ thay đổi việc sử dụng dấu thời gian! –

+0

Ok, tôi hiểu lời giải thích tôi sẽ sử dụng nó. gọi tôi là ngu ngốc, nhưng trong lý do của tôi thêm giờ để chỉ ngày nên tăng ngoại lệ trong bất kỳ của cả hai :) tuy nhiên nó không nhỏ gọn trong hình thức này. Tôi nghĩ rằng việc thêm thời gian trong một ngày (24 giờ) có thể là có thể. Làm thế nào tôi có thể đạt được điều đó trong trạng thái hiện tại, giống như thêm 2h33m đến nay()? – xliiv

1

Đây là một chức năng có thêm một time đến một timedelta:

def time_plus(time, timedelta): 
    start = datetime.datetime(
     2000, 1, 1, 
     hour=time.hour, minute=time.minute, second=time.second) 
    end = start + timedelta 
    return end.time() 

này sẽ cung cấp các kết quả mong đợi quá lâu như bạn không thêm lần theo một cách mà vượt qua một ranh giới nửa đêm.

Các vấn đề liên quan