1

我创建了一个 datetime 对象,从中减去 13 天,如下所示:

(date.today()-timedelta(days=13)).strftime('%Y-%m-%d')

当我在早上 6 点和早上 8 点 30 分执行代码时,就会发生奇怪的事情。在早上 6 点,结果字符串返回为(如果今天是 2012-02-29):

2012-02-15

这是当前的14天前!但是,在上午 8:30 运行同一行,结果字符串返回为:

2012-02-16

然后正确。到目前为止,我还无法弄清楚这小段时间之间有什么区别。如果这很重要,我会使用时区天真的日期时间对象。我想知道什么可能导致结果字符串日期发生这种变化。

非常感谢。

编辑:(基于下面eumiro的建议)

datetime.datetime.now() 返回:

>>> datetime.datetime(2012, 2, 29, 10, 46, 20, 659862) 

服务器和运行代码行的 django 应用程序中的时区是 Europe/Vienna。

我还尝试运行与您建议的行类似的行:

(pytz.timezone(settings.TIME_ZONE).localize(datetime.now(), is_dst=True) - \
    timedelta(days=13)).strftime('%Y-%m-%d') 

但是结果相同......这就是为什么我认为我认为它与时区也没有太大关系。但同时不知道还能去哪里看。

4

2 回答 2

0

你住在美国的某个地方?这是时区比 UTC 晚约 6-8 小时的地方,这是 UTC 午夜的时间。

返回什么datetime.datetime.now()

如果您想获得真正的本地时间,请使用它(替换"America/New_York"为您的时区):

from datetime import datetime, timedelta
import pytz

now = datetime.datetime.now(pytz.timezone("America/New_York"))
dt = (now - timedelta(days=13)).strftime('%Y-%m-%d')

它应该从午夜到午夜返回相同的正确值。

于 2012-02-29T09:39:34.297 回答
0

不幸的是,Python 对 DST 的支持很差。

即使 pytz 也不完美,但可以使用 hacks。

您必须决定从 10 日下午 1 点减去 2 天,或者 2 个日历日或 48 小时或 172800 秒,这意味着什么。

于 2012-02-29T10:15:13.370 回答