【问题标题】:Python datetime subtracting date oddityPython datetime 减去日期奇数
【发布时间】:2012-02-29 09:30:57
【问题描述】:

我创建了一个 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') 

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

【问题讨论】:

    标签: python datetime date timedelta


    【解决方案1】:

    你住在美国的某个地方?这是时区比 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')
    

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

    【讨论】:

    • 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') 但结果相同......这就是为什么我很困惑。可能是上面一行中的 is_dst=True 吗?谢谢你的回复。
    • 奥地利的 DST 问题总是与 UTC 时间相差最多两个小时,因此显然美国时区(6-8 小时)不是问题。
    【解决方案2】:

    很遗憾,Python 对 DST 的支持很差。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2015-08-04
      相关资源
      最近更新 更多