Cách sạch sẽ nhất và Pythonic nhất để có được ngày mai?


120

Cách sạch nhất và Pythonic nhất để có được ngày mai là gì? Phải có một cách tốt hơn là thêm một vào ngày, xử lý các ngày vào cuối tháng, v.v.

Câu trả lời:


241

datetime.date.today() + datetime.timedelta(days=1) nên làm thủ thuật


39

timedelta có thể xử lý việc thêm ngày, giây, micro giây, 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 bình luận, ngày nhuận không có vấn đề gì:

>>> 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)

7

Không xử lý giây nhuận 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'

anh yêu.

CHỈNH SỬA - @Mark: 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 nghĩ rằng gmtime hoặc localtime sẽ lấy giá trị do mktime trả về và trả lại cho tôi bộ giá trị ban đầu, với 60 là số giây. Và thử nghiệm này cho thấy rằng những giây nhuận này 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


Điều này là do thời gian Unix không xử lý giây nhuận. Xem en.wikipedia.org/wiki/Unix_time#History , mail-archive.com/leapsecs@rom.usno.navy.mil/msg00094.html và bản thân POSIX.

"mỗi và mỗi ngày sẽ được tính bằng chính xác 86400 giây" opengroup.org/onlinepubs/9699919799/basedefs/…

Năm nhuận tính cho sự khác biệt giữa năm mặt trời và thậm chí 365 ngày, trong khi giây nhuận vốn đã khác nhau và giải thích cho sự khác biệt gây ra bởi các yếu tố bên ngoài như động đất. Điều này làm cho chúng không thường xuyên và không thể được xác định theo cách tương tự, ví dụ như xác định ngày trong tuần mà ngày 3 tháng 3 năm 2055 sẽ hạ cánh.
David Woods

1
@DavidWoods: giây nhuận là để giữ UTC trong vòng +/- 0,9 giây kể từ UT1 (vòng quay Trái đất). Có 25 giây nhuận được tích lũy từ năm 1972 đến năm 2012. Động đất quá yếu để gây ra nó ( một trận động đất duy nhất có thể gây ra những thay đổi micro giây - ít hơn hàng nghìn lần so với sự chênh lệch mili giây điển hình trong khoảng thời gian trong ngày từ 86400 giây SI ).
jfs

5

Ngay cả timemô-đun cơ bản cũng có thể xử lý điều này:

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

1
Điều này không thành công với ranh giới của Giờ tiết kiệm ánh sáng ban ngày ở các tiểu bang thống nhất, bởi vì ở những 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 nhuận.
Charles Wood

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

Đúng, sẽ luôn là 24 giờ kể từ bây giờ, nhưng đó không phải là câu hỏi. OP muốn biết làm thế nào để có được ngày mai . Thứ giây nhuận chỉ là nitpicking;)
Charles Wood

@CharlesWood: vâng. Tôi vừa làm rõ rằng nó không quay trở lại 23, 25 giờ. Và có, nó có thể trả về ngày sai (không phải ngày mai, ví dụ như "2014-10-18 23:00:00" ở múi giờ "Brazil / Đông"). Liên quan: Với thời gian hiện tại theo giờ UTC, làm cách nào để bạn xác định thời gian bắt đầu và kết thúc trong ngày trong một múi giờ cụ thể? .
jfs

@JFSebastian Đúng vậy, tôi chỉ đang cố gắng chỉ ra rằng ngày không phải lúc nào cũng dài 24 giờ . Không có gì ngạc nhiên khi làm việc với ngày khó đến vậy; thật khó để giao tiếp về họ: /
Charles Wood
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.