2009-01-13 229 views

回答

782

可以使用timedelta对象:

from datetime import datetime, timedelta 

d = datetime.today() - timedelta(days=days_to_subtract) 
+7

如果你不忽略时区,那么[答案更复杂](http://stackoverflow.com/a/25427822/4279)。 – jfs 2014-08-21 13:39:24

+0

它与月,年等一起工作吗? – JohnAndrews 2017-03-29 12:01:25

58

减去datetime.timedelta(days=1)

21

只是阐述的替代方法和为它是有帮助的一个使用实例:

  • 减去1从当前日期时间开始的日期:
from datetime import datetime, timedelta 
print datetime.now() + timedelta(days=-1) # Here, I am adding a negative timedelta 
  • 有用的案例,如果你想加5天,减去当前日期时间5小时。即从现在起5天后什么是日期时间,但是少了5个小时?
from datetime import datetime, timedelta 
print datetime.now() + timedelta(days=5, hours=-5) 

它可以类似地与例如其它参数用于秒,星期等

33

如果你的Python的datetime对象是时区感知比你要小心,以避免各地DST转换的错误(或其他原因抵消UTC变化):

from datetime import datetime, timedelta 
from tzlocal import get_localzone # pip install tzlocal 

DAY = timedelta(1) 
local_tz = get_localzone() # get local timezone 
now = datetime.now(local_tz) # get timezone-aware datetime object 
day_ago = local_tz.normalize(now - DAY) # exactly 24 hours ago, time may differ 
naive = now.replace(tzinfo=None) - DAY # same time 
yesterday = local_tz.localize(naive, is_dst=None) # but elapsed hours may differ 

一般来说,day_ago如果当地时区的UTC偏差在最后一天发生变化,则yesterday可能会有所不同。

例如,夏令时/夏令时在2014年11月2日凌晨02:00:00结束。因此在美国/洛杉矶时区,如果:

import pytz # pip install pytz 

local_tz = pytz.timezone('America/Los_Angeles') 
now = local_tz.localize(datetime(2014, 11, 2, 10), is_dst=None) 
# 2014-11-02 10:00:00 PST-0800 

然后day_agoyesterday不同:

  • day_ago正好24小时之前(相对于now),但在上午11点,而不是在上午10作为now
  • yesterday昨天上午10点,但它是25小时前(相对于now),而不是24小时。

pendulum module自动处理它:

>>> import pendulum # $ pip install pendulum 

>>> now = pendulum.create(2014, 11, 2, 10, tz='America/Los_Angeles') 
>>> day_ago = now.subtract(hours=24) # exactly 24 hours ago 
>>> yesterday = now.subtract(days=1) # yesterday at 10 am but it is 25 hours ago 

>>> (now - day_ago).in_hours() 
24 
>>> (now - yesterday).in_hours() 
25 

>>> now 
<Pendulum [2014-11-02T10:00:00-08:00]> 
>>> day_ago 
<Pendulum [2014-11-01T11:00:00-07:00]> 
>>> yesterday 
<Pendulum [2014-11-01T10:00:00-07:00]> 
5

还只是一个不错的功能,我想用我的时候要计算的最后一个月或其他亲属timedeltas等即第一/最后一天...

dateutil功能relativedelta功能(一个功能强大的扩展到datetime LIB)

import datetime as dt 
from dateutil.relativedelta import relativedelta 
#get first and last day of this and last month) 
today = dt.date.today() 
first_day_this_month = dt.date(day=1, month=today.month, year=today.year) 
last_day_last_month = first_day_this_month - relativedelta(days=1) 
print (first_day_this_month, last_day_last_month) 

>2015-03-01 2015-02-28 
6

健奥箭头模块存在

import arrow 
utc = arrow.utcnow() 
utc_yesterday = utc.shift(days=-1) 
print(utc, '\n', utc_yesterday) 

输出:

2017-04-06T11:17:34.431397+00:00 
2017-04-05T11:17:34.431397+00:00 
相关问题