时间 - 获取昨天的日期

时间:2015-04-23 17:59:34

标签: python datetime time

我正在尝试使用Python的time模块来获取今天和昨天的时间。

这对我来说适用于今天的日期:

dt = time.strptime(time.strftime("%d/%m/%Y"),'%d/%m/%Y')

但我不知道如何得到昨天的日期。 我发现很多教程使用了datetime模块,但没有使用time模块。

我该怎么做?是否有更好的方法来获取今天的日期(struct_time)?

3 个答案:

答案 0 :(得分:3)

要获取昨天的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时间(昨天作为一个有意识的datetime对象获得),请参见How can I subtract a day from a python date?

你昨天也可以只使用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月已经跳过几天),那么日期也是正确的。< / p>

答案 1 :(得分:2)

首先,有一种更直接的方式来获取当前日期:

dt = time.localtime()

要获取前一天的日期,您需要从当前时间减去24小时。这可能会在DST过渡期间出现一些问题,但我会将这些作为练习留给读者。

dt = time.localtime(time.time() - 86400)

答案 2 :(得分:1)

如果您有time个对象,则可以先将其转换为datetime

>>> import time
>>> import datetime

>>> dt = time.strptime(time.strftime("%d/%m/%Y"),'%d/%m/%Y')
>>> # base time object: time.struct_time(tm_year=2015, tm_mon=4, tm_mday=23, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=113, tm_isdst=-1)

>>> a_datetime_obj = datetime.datetime.fromtimestamp(time.mktime(dt))
>>> # convert to datetime: 2015-04-23 00:00:00

>>> minus_one = a_datetime_obj - datetime.timedelta(days=1)
>>> # subtract one day: 2015-04-22 00:00:00

>>> print minus_one.timetuple()
>>> # get time object from datetime: 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)