在Python中获取安全的昨天日期
我有一个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)
这个方法的实现是减去24小时,而在2013-03-11 0:35 CDT
之前的24小时是2013-03-09 23:35 CST
,所以结果就是"2013-03-09"
。
那么,有什么好的方法可以在Python中安全地获取昨天的日期,避免夏令时的问题呢?
更新: 在bukzor指出我的代码应该正常工作后,我回去检查了一下脚本,发现其实它没有被使用。虽然它设置了默认值,但一个外部的shell脚本明确设置了日期。所以问题出在shell脚本上,而不是Python脚本。
3 个回答
7
如果你使用一个不懂时区(特别是夏令时)的简单 datetime
对象,你会得到 2013-03-10
。
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()
会报错)。
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()
函数实现了。
39
datetime.date.fromordinal(datetime.date.today().toordinal()-1)
当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。