要获取昨天的struct_time,请使用多个existing datetime solutions 中的任何一个并调用.timetuple() 以获取struct_time,例如:
#!/usr/bin/env python
from datetime import date, timedelta
today = date.today()
yesterday = today - timedelta(1)
print(yesterday.timetuple())
# -> time.struct_time(tm_year=2015, tm_mon=4, tm_mday=22, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=112, tm_isdst=-1)
即使在 DST 转换前后,它也会在当地时区生成正确的日期。
如果您想查找相应的 UTC 时间,请参阅 How can I subtract a day from a python date?(获取昨天作为感知 datetime 对象)。
您也可以只使用 time 模块(但不那么直接)获得昨天:
#!/usr/bin/env python
import time
def posix_time(utc_time_tuple):
"""seconds since Epoch as defined by POSIX."""
# from https://gist.github.com/zed/ff4e35df3887c1f82002
tm_year = utc_time_tuple.tm_year - 1900
tm_yday = utc_time_tuple.tm_yday - 1
tm_hour = utc_time_tuple.tm_hour
tm_min = utc_time_tuple.tm_min
tm_sec = utc_time_tuple.tm_sec
# http://pubs.opengroup.org/stage7tc1/basedefs/V1_chap04.html#tag_04_15
return (tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 +
(tm_year-70)*31536000 + ((tm_year-69)//4)*86400 -
((tm_year-1)//100)*86400 + ((tm_year+299)//400)*86400)
now = time.localtime()
yesterday = time.gmtime(posix_time(now) - 86400)
print(yesterday)
# -> time.struct_time(tm_year=2015, tm_mon=4, tm_mday=22, tm_hour=22, tm_min=6, tm_sec=16, tm_wday=2, tm_yday=112, tm_isdst=0)
它假定time.gmtime() 接受给定平台上的 POSIX 时间戳(Python's stdlib breaks otherwise 例如,如果使用非 POSIX TZ=right/UTC)。 calendar.timegm() 可以用来代替posix_time(),但前者可以在内部使用datetime。
注意:yesterday 代表两种解决方案中的本地时间(gmtime() 只是在这里实现减法的一种简单方法)。两种解决方案都使用天真的时区不感知时间对象,因此结果可能是不明确的,甚至不存在时间,尽管除非本地时区昨天跳过(例如,俄罗斯在 1918 年 2 月跳过了几天),那么无论如何日期都是正确的。