明日の日付を取得するための最もクリーンで最もPythonicな方法?


120

明日の日付を取得する最もクリーンで最もPythonicな方法は何ですか?日に1を追加したり、月末に日を処理したりするなど、より良い方法がなければなりません。

回答:



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


これは、Unix時間がうるう秒を処理しないためです。参照en.wikipedia.org/wiki/Unix_time#Historymail-archive.com/leapsecs@rom.usno.navy.mil/msg00094.html、およびPOSIX自身を。

「毎日、正確に86400秒を占める」opengroup.org/onlinepubs/9699919799/basedefs/…–

うるう年は、太陽年と365日の違いを説明しますが、うるう秒は本質的に異なり、地震などの外部要因によって引き起こされる違いを説明します。これはそれらを不規則にし、例えば2055年3月3日が到着する曜日を決定するのと同じ方法で決定することはできません。
デビッドウッズ

1
@DavidWoods:うるう秒はUTCをUT1(地球の回転)から+/- 0.9秒以内に保つことです。1972年から2012年までに25うるう秒が蓄積されています。地震は弱すぎて引き起こすことができません(1回の地震でマイクロ秒の変化が生じる可能性があります。86400SI秒からの1日の継続時間の標準的なミリ秒の差の1000分の1です)。
jfs

5

基本的なtimeモジュールでもこれを処理できます:

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

1
これは、アメリカ合衆国の夏時間の境界では失敗します。これらの境界では、1日は23時間、1日は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での現在の時刻を考慮して、特定のタイムゾーンでの1日の開始時刻と終了時刻をどのように決定しますか?
jfs

@JFSebastianそうです、私はただ日が常に24時間であるとは限らないことを指摘しようとしていました。日付の操作がそれほど難しいのも不思議ではありません。それらについて通信することすら難しい:/
Charles Wood
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.