我有一个python脚本使用此调用以YYYY-MM-DD格式获取昨天的日期:
str(date.today() - timedelta(days=1)))
它大部分时间都可以使用,但是当脚本今天早上在2013-03-11 0:35 CDT
运行时,它返回"2013-03-09"
而不是"2013-03-10"
。
据推测,夏令时(昨天开始)是罪魁祸首。我想timedelta(days=1)
实施的方式是在2013-03-11 0:35 CDT
2013-03-09 23:35 CST
之前24小时减去24小时,这导致了"2013-03-09"
的结果。
那么在python中获取昨天日期的DST安全方法是什么?
更新 在bukzor指出我的代码应该正常工作之后,我回到脚本并确定它没有被使用。它设置了默认值,但是包装器shell脚本显式设置了日期。所以bug在shell脚本中,而不是python脚本。
答案 0 :(得分:39)
datetime.date.fromordinal(datetime.date.today().toordinal()-1)
答案 1 :(得分:10)
我无法在python2.7或python3.2中重现您的问题:
>>> import datetime
>>> today = datetime.date(2013, 3, 11)
>>> print today
2013-03-11
>>> day = datetime.timedelta(days=1)
>>> print today - day
2013-03-10
在我看来,这已经是“日光节约安全”yesterday()
功能的最简单实现。
答案 2 :(得分:7)
如果您使用对时区(特别是DST)一无所知的天真2013-03-10
对象,您将获得datetime
:
from datetime import datetime, timedelta
dt_naive = datetime(2013, 3, 11, 0, 35)
print((dt_naive - timedelta(days=1)).date()) # ignores DST
# -> 2013-03-10
如果您对24小时前的日期感兴趣, 2013-03-09
是正确的。
import pytz # $ pip install pytz
local_tz = pytz.timezone("America/Chicago") # specify your local timezone
dt = local_tz.localize(dt_naive, is_dst=None) # raise if dt_naive is ambiguous
yesterday = local_tz.normalize(dt - timedelta(days=1)).date()
print(yesterday)
# -> 2013-03-09
注意:.date()
会删除时区信息,以便您再次获得2013-03-10
:
print(dt.date() - timedelta(days=1))
# -> 2013-03-10
要获得昨天的特定时区:
from datetime import datetime, time, timedelta
import pytz # $ pip install pytz
tz = pytz.timezone("America/Chicago")
yesterday = datetime.now(tz).date() - timedelta(days=1)
# to add timezone info back (to get yesterday's midnight)
midnight = tz.localize(datetime.combine(yesterday, time(0, 0)), is_dst=None)
如果时区在这段时间内缺少几天,那么通过剥离时区信息获取昨天可能会失败。然后,此方法将在给定时区中生成不存在的日期(tz.localize()
会引发错误)。