Yarının randevusunu almanın en temiz ve en Pythonic yolu?


120

Yarının randevusunu almanın en temiz ve en Pythonic yolu nedir? Güne bir tane eklemekten, günleri ayın sonunda işlemekten vb. Daha iyi bir yol olmalı.

Yanıtlar:


241

datetime.date.today() + datetime.timedelta(days=1) hile yapmalı


39

timedelta gün, saniye, mikrosaniye, milisaniye, dakika, saat veya hafta eklemeyi halledebilir.

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

Bir yorumda sorulduğu gibi, artık günler sorun teşkil etmez:

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

Artık saniyelerin işlenmesi yok 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'

lanetlemek.

EDIT - @Mark: Dokümanlar "evet" diyor, ancak kod "o kadar değil" diyor:

>>> 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 veya localtime'ın mktime tarafından döndürülen değeri alacağını ve bana orijinal demeti geri vereceğini düşünürdüm, 60 saniye olarak. Ve bu test, bu artık saniyelerin kaybolabileceğini gösteriyor ...

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


Bunun nedeni Unix zamanının artık saniyeleri işlememesidir. Bkz en.wikipedia.org/wiki/Unix_time#History , mail-archive.com/leapsecs@rom.usno.navy.mil/msg00094.html ve POSIX kendisi.

"her gün tam olarak 86400 saniye olarak hesaplanacaktır" opengroup.org/onlinepubs/9699919799/basedefs/…

Artık yıllar, güneş yılı ile 365 gün arasındaki farkı hesaba katarken, artık saniyeler doğası gereği farklıdır ve depremler gibi dış faktörlerin neden olduğu farklılıkları açıklar. Bu onları düzensiz yapar ve aynı şekilde belirlenemez, örneğin 3 Mart 2055'in geleceği haftanın gününü belirlemek gibi.
David Woods

1
@DavidWoods: Artık saniyeler, UTC'yi UT1'den (Dünya dönüşü) +/- 0,9 saniye içinde tutmaktır. 1972'den 2012'ye kadar birikmiş 25 artık saniye vardır. Depremler buna neden olamayacak kadar zayıftır ( tek bir deprem, mikro saniyelik değişikliklere neden olabilir - 86400 SI saniyeden gün içinde tipik bir milisaniye farkından bin kat daha az ).
jfs

5

Temel timemodül bile bunu halledebilir:

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

1
Bu, Amerika Birleşik Devletleri'nde Yaz Saati Uygulaması sınırlarında başarısız olur, çünkü bu sınırlarda bir gün 23 saat ve bir gün 25 saat olacaktır. Bu da artık saniyeleri hesaba katmaz.
Charles Wood

@CharlesWood: Bu cevap farklı bir saat döndürebilir, bu (bazı saat dilimlerinde) farklı bir tarih dönebileceği anlamına gelebilir (yarın değil) ancak her zaman tam olarak 24 saat ilerideki zamanı döndürür (kabul edilen cevap gece yarısı döner (şu andan itibaren bilinmeyen saatler) )). 23:59:60 ve 00:00:00 saatlerinin aynı zaman damgasına sahip olduğu sistemlerde artık saniye sırasında çağrılmadıkça artık saniyelerin burada sonucu nasıl değiştirebileceğini anlamıyorum.
jfs

Doğru, her zaman 24 saat sonra olacak, ama soru bu değildi. OP yarının randevusunu nasıl bulacağını öğrenmek istedi . Artık saniyeler meselesi biraz titriyordu;)
Charles Wood

@CharlesWood: evet. 23-25 ​​saat geri dönmeyeceğini açıkladım. Ve evet, yanlış tarih döndürebilir (yarın değil, örneğin "Brezilya / Doğu" saat diliminde "2014-10-18 23:00:00" için). İlgili: UTC'deki mevcut saat göz önüne alındığında, belirli bir saat diliminde günün başlangıç ​​ve bitiş saatini nasıl belirlersiniz? .
jfs

@JFSebastian Doğru, ben sadece günlerin her zaman 24 saat sürmediğini belirtmeye çalışıyordum . Tarihlerle çalışmanın bu kadar zor olmasına şaşmamalı; onlar hakkında iletişim kurmak bile zor: /
Charles Wood
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.