วิธีที่สะอาดที่สุดและเป็น Pythonic ที่สุดในการรับวันพรุ่งนี้?


120

วิธีใดที่สะอาดที่สุดและเป็น Pythonic ที่สุดในการหาวันพรุ่งนี้? ต้องมีวิธีที่ดีกว่าการเพิ่มวันจัดการวันสิ้นเดือน ฯลฯ

คำตอบ:



39

timedelta สามารถรองรับการเพิ่มวันวินาทีไมโครวินาทีมิลลิวินาทีนาทีชั่วโมงหรือสัปดาห์

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

ตามที่ถามในความคิดเห็นวันอธิกสุรทินไม่มีปัญหา:

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

ไม่มีการจัดการวินาทีอธิก :

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

ยี้

แก้ไข - @ มาร์ค: เอกสารบอกว่า "ใช่" แต่รหัสระบุว่า "ไม่มาก":

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

ฉันคิดว่า gmtime หรือ localtime จะรับค่าที่ส่งคืนโดย mktime และคืนค่าทูเปิลดั้งเดิมให้ฉันโดยมี 60 เป็นจำนวนวินาที และการทดสอบนี้แสดงให้เห็นว่าวินาทีอธิกสุรทินเหล่านี้สามารถเลือนหายไปได้ ...

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

time.strftimeจัดการอธิกวินาที: ดูหมายเหตุ 2: docs.python.org/library/time.html#time.strftimeและหมายเหตุ 3: docs.python.org/library/datetime.html#strftime-behavior
Mark Rushakoff

เนื่องจากเวลา Unix ไม่รองรับวินาทีอธิกสุรทิน ดูen.wikipedia.org/wiki/Unix_time#History , mail-archive.com/leapsecs@rom.usno.navy.mil/msg00094.htmlและ POSIX เอง

"แต่ละวันจะคิดเป็น 86400 วินาที" opengroup.org/onlinepubs/9699919799/basedefs/…

ปีอธิกสุรทินแสดงถึงความแตกต่างระหว่างปีสุริยคติกับ 365 วันในขณะที่วินาทีอธิกสุรทินมีความแตกต่างกันโดยเนื้อแท้และมีความแตกต่างที่เกิดจากปัจจัยภายนอกเช่นแผ่นดินไหว สิ่งนี้ทำให้ผิดปกติและไม่สามารถกำหนดได้ในลักษณะเดียวกับเช่นการกำหนดวันในสัปดาห์ที่ 3 มีนาคม 2598 จะมาถึง
David Woods

1
@DavidWoods: อธิกวินาทีคือการรักษา UTC ภายใน +/- 0.9 วินาทีจาก UT1 (การหมุนของโลก) มีการสะสม 25 วินาทีอธิกสุรทินตั้งแต่ปีพ. ศ. 2515 ถึง พ.ศ. 2555 แผ่นดินไหวมีความอ่อนแอเกินกว่าที่จะทำให้เกิดแผ่นดินไหวได้ ( แผ่นดินไหวเพียงครั้งเดียวอาจทำให้เกิดการเปลี่ยนแปลงในระดับไมโครวินาทีซึ่งน้อยกว่าความแตกต่างของมิลลิวินาทีทั่วไปถึงพันเท่าในระยะเวลาของวันจาก 86400 SI วินาที )
jfs

5

แม้แต่timeโมดูลพื้นฐานก็สามารถจัดการสิ่งนี้ได้:

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

1
สิ่งนี้ล้มเหลวในขอบเขตของเวลาออมแสงในสหรัฐอเมริกาเนื่องจากในขอบเขตเหล่านั้นวันหนึ่งจะมี 23 ชั่วโมงและวันหนึ่งจะมี 25 ชั่วโมง นอกจากนี้ยังไม่คำนึงถึงวินาทีอธิกสุรทิน
Charles Wood

@CharlesWood: คำตอบนี้อาจส่งคืนชั่วโมงที่แตกต่างกันซึ่ง (ในบางเขตเวลา) หมายความว่าอาจส่งคืนวันที่ที่แตกต่างกัน (ไม่ใช่วันพรุ่งนี้) แต่จะส่งคืนเวลาที่ตรงกับ 24 ชั่วโมงข้างหน้าเสมอ (คำตอบที่ยอมรับจะส่งคืนเที่ยงคืน (ไม่ทราบชั่วโมงนับจากนี้ )) ฉันไม่เห็นว่าวินาทีอธิกสุรทินสามารถเปลี่ยนแปลงผลลัพธ์ที่นี่ได้อย่างไรเว้นแต่จะถูกเรียกในช่วงวินาทีอธิกสุรทินในระบบที่เวลา 23:59:60 น. และ 00:00:00 น. มีเวลาประทับเดียวกัน
jfs

จริงอยู่มันจะเป็น 24 ชั่วโมงต่อจากนี้เสมอ แต่นั่นไม่ใช่คำถาม OP อยากจะรู้ว่าจะได้รับวันพรุ่งนี้ วินาทีอธิกสุรทินเป็นเพียงแค่การคิดเท่านั้น;)
Charles Wood

@CharlesWood: ใช่ ฉันเพิ่งชี้แจงว่ามันไม่กลับ 23, 25 ชั่วโมง และใช่อาจส่งคืนวันที่ไม่ถูกต้อง (ไม่ใช่พรุ่งนี้เช่นสำหรับ "2014-10-18 23:00:00" ในเขตเวลา "บราซิล / ตะวันออก") ที่เกี่ยวข้อง: ระบุเวลาปัจจุบันเป็น UTC คุณจะกำหนดเวลาเริ่มต้นและเวลาสิ้นสุดของวันในเขตเวลาใดได้อย่างไร .
jfs

@JFSebastian ใช่ฉันแค่พยายามชี้ให้เห็นว่าวันนั้นไม่ได้ยาวนานตลอด 24 ชั่วโมงเสมอไป ไม่น่าแปลกใจที่การทำงานกับเดทนั้นยากมาก มันยากที่จะสื่อสารเกี่ยวกับพวกเขา: /
Charles Wood
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.