2008-09-24 53 views
60

Tôi muốn tìm hiểu xem một đối tượng ngày giờ trăn cụ thể có lớn hơn X giờ hoặc phút không. Tôi đang cố gắng làm điều gì đó tương tự như:So sánh ngày của Python

if (datetime.now() - self.timestamp) > 100 
# Where 100 is either seconds or minutes 

Điều này tạo ra lỗi loại.

Cách thích hợp để so sánh thời gian ngày trong python là gì? Tôi đã xem xét WorkingWithTime gần nhưng không chính xác những gì tôi muốn. Tôi cho rằng tôi chỉ muốn đối tượng datetime được biểu thị bằng giây để tôi có thể so sánh int bình thường.

Vui lòng đăng danh sách các phương pháp hay nhất về datetime.

+0

'datetime.now()' (hoặc thời gian cục bộ khác như là một đối tượng datetime * ngây thơ *) có thể thất bại xung quanh các chuyển đổi DST hoặc thay đổi trong UTC offset cho múi giờ địa phương vì các lý do khác. Thời gian UTC hoặc một đối tượng datetime nhận thức nên được sử dụng thay vào đó, ví dụ: 'datetime.utcnow()' hoặc 'datetime.now (timezone.utc) .astimezone()'. – jfs

Trả lời

108

Sử dụng datetime.timedelta lớp học:

>>> from datetime import datetime, timedelta 
>>> then = datetime.now() - timedelta(hours = 2) 
>>> now = datetime.now() 
>>> (now - then) > timedelta(days = 1) 
False 
>>> (now - then) > timedelta(hours = 1) 
True 

Ví dụ của bạn có thể được viết là:

if (datetime.now() - self.timestamp) > timedelta(seconds = 100) 

hoặc

if (datetime.now() - self.timestamp) > timedelta(minutes = 100) 
0

Bạn có thể trừ hai đối tượng datetime để tìm sự khác biệt giữa chúng.
Bạn có thể sử dụng datetime.fromtimestamp để phân tích dấu thời gian POSIX.

1

Bạn có thể sử dụng một sự kết hợp của 'ngày' và các thuộc tính 'giây' của đối tượng quay trở lại để tìm ra câu trả lời, như thế này:

def seconds_difference(stamp1, stamp2): 
    delta = stamp1 - stamp2 
    return 24*60*60*delta.days + delta.seconds + delta.microseconds/1000000. 

Sử dụng abs() trong câu trả lời nếu bạn luôn muốn số giây dương tính.

Để khám phá bao nhiêu giây vào quá khứ một thời gian có được, bạn có thể sử dụng nó như thế này:

if seconds_difference(datetime.datetime.now(), timestamp) < 100: 
    pass 
5

Hãy so sánh sự khác biệt với một timedelta mà bạn tạo ra:

if datetime.datetime.now() - timestamp > datetime.timedelta(seconds = 5): 
    print 'older' 
0

Giống như vậy:

# self.timestamp should be a datetime object 
if (datetime.now() - self.timestamp).seconds > 100: 
    print "object is over 100 seconds old" 
+0

Tôi không nghĩ rằng nó hoạt động. Thuộc tính giây cho http://docs.python.org/lib/datetime-timedelta.html được định giới hạn trong 1 ngày, vì vậy nếu thời lượng của bạn dài hơn 1 ngày, nó sẽ không chính xác –

+0

tất cả những gì bạn sẽ phải làm là so sánh nó với một timedelta thay vì thuộc tính giây. –

5

Alternative:

if (datetime.now() - self.timestamp).total_seconds() > 100: 

Giả sử self.timestamp là một ví dụ datetime

+1

Điều đáng nói đến là total_seconds() có sẵn từ Python 2.7. – szymond