Чтобы получить вчерашний 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)
Он производит правильный день в местном часовом поясе даже вокруг летнего времени переходов.
См. How can I subtract a day from a python date?, если вы хотите найти соответствующее время по UTC (получите вчера как осведомленный объект 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 года), то дата в любом случае правильная.
Вы можете проверить этот ответ: http://stackoverflow.com/a/441152/870769 – sthzg
@sthzg Спасибо за ответ, но есть модуль datetime, а не время. –
Как вы ожидаете получить дату из класса, который не поддерживает даты? –