2009-10-01 20 views

Trả lời

133

datetime.date.today() + datetime.timedelta(days=1) nên làm các trick

30

timedelta có thể xử lý thêm ngày, giây, micro, mili giây, phút, giờ hoặc tuần.

>>> import datetime 
>>> today = datetime.date.today() 
>>> today 
datetime.date(2009, 10, 1) 
>>> today + datetime.timedelta(days=1) 
datetime.date(2009, 10, 2) 
>>> datetime.date(2009,10,31) + datetime.timedelta(hours=24) 
datetime.date(2009, 11, 1) 

Như hỏi trong một chú thích, nhảy ngày không gây vấn đề:

>>> datetime.date(2004, 2, 28) + datetime.timedelta(days=1) 
datetime.date(2004, 2, 29) 
>>> datetime.date(2004, 2, 28) + datetime.timedelta(days=2) 
datetime.date(2004, 3, 1) 
>>> datetime.date(2005, 2, 28) + datetime.timedelta(days=1) 
datetime.date(2005, 3, 1) 
+0

Nó xử lý năm nhuận ok? – Rook

+0

@ldigas: yes it does. – nosklo

5

Không xử lý leap seconds tho:

>>> from datetime import datetime, timedelta 
>>> dt = datetime(2008,12,31,23,59,59) 
>>> str(dt) 
'2008-12-31 23:59:59' 
>>> # leap second was added at the end of 2008, 
>>> # adding one second should create a datetime 
>>> # of '2008-12-31 23:59:60' 
>>> str(dt+timedelta(0,1)) 
'2009-01-01 00:00:00' 
>>> str(dt+timedelta(0,2)) 
'2009-01-01 00:00:01' 

darn.

EDIT - @ Mark: Các tài liệu nói "có", nhưng mã nói "không quá nhiều":

>>> time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S") 
(2008, 12, 31, 23, 59, 60, 2, 366, -1) 
>>> time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S")) 
1230789600.0 
>>> time.gmtime(time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S"))) 
(2009, 1, 1, 6, 0, 0, 3, 1, 0) 
>>> time.localtime(time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S"))) 
(2009, 1, 1, 0, 0, 0, 3, 1, 0) 

tôi sẽ nghĩ rằng gmtime hoặc localtime sẽ mang giá trị trả về bởi mktime và cho tôi trả về bản gốc, với 60 là số giây. Và thử nghiệm này cho thấy rằng những giây nhuận chỉ có thể biến mất ...

>>> a = time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S")) 
>>> b = time.mktime(time.strptime("2009-01-01 00:00:00","%Y-%m-%d %H:%M:%S")) 
>>> a,b 
(1230789600.0, 1230789600.0) 
>>> b-a 
0.0 
+0

'time.strftime' xử lý giây nhuận: xem Chú thích 2: http://docs.python.org/library/time.html#time.strftime và Lưu ý 3: http://docs.python.org/library/datetime .html # strftime-behavior –

+0

Điều này là do thời gian Unix không xử lý giây nhảy vọt. Xem http://en.wikipedia.org/wiki/Unix_time#History, http://www.mail-archive.com/[email protected]/msg00094.html và POSIX. –

+0

"mỗi ngày sẽ được tính chính xác 86400 giây" http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_15 –

4

Ngay cả những cơ bản time mô-đun có thể xử lý này:

import time 
time.localtime(time.time() + 24*3600) 
+0

Giải pháp thanh lịch nhất trong số tất cả – Greg

+0

Điều này không thành công trong phạm vi Thời gian tiết kiệm ánh sáng ban ngày ở Hoa Kỳ, bởi vì tại các ranh giới đó một ngày sẽ có 23 giờ và một ngày sẽ có 25 giờ. Điều này cũng không tính đến giây nhảy vọt. –

+0

@CharlesWood: câu trả lời này có thể trả về một giờ khác nhau (trong một số múi giờ) có nghĩa là nó có thể trả về ** ngày khác ** (không phải ngày mai) nhưng nó luôn trả về thời gian chính xác 24 giờ (câu trả lời được chấp nhận trả về nửa đêm (giờ chưa biết từ bây giờ)). Tôi không thấy những giây nhảy vọt có thể thay đổi kết quả ở đây trừ khi được gọi trong giây lát nhảy vọt trên các hệ thống mà ở đó 23:59:60 và 00:00:00 có cùng dấu thời gian. – jfs

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