用Python获取昨天的日期,DST-s

2024-05-23 19:14:47 发布

您现在位置: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获得昨天约会的DST安全的好方法是什么呢?

更新: 在bukzor指出我的代码应该正常工作之后,我回到脚本并确定它没有被使用。它设置默认值,但包装外壳脚本显式地设置了日期。所以bug在shell脚本中,而不是python脚本中。


Tags: 方法脚本todaydate格式时间daysdd
3条回答

如果使用不知道时区(尤其是DST)的naive 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

2013-03-09如果您对24小时前的日期感兴趣,那么它是正确的。

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()引发错误)。

我无法在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()功能的最简单实现。

datetime.date.fromordinal(datetime.date.today().toordinal()-1)

相关问题 更多 >