时间 - 获取昨天的日期
Time - get yesterdays date
我正在尝试使用 Python 的 time
模块获取今天和昨天的时间。
这对我来说适用于今天的日期:
dt = time.strptime(time.strftime("%d/%m/%Y"),'%d/%m/%Y')
但是我不知道如何得到昨天的日期。
我发现许多使用 datetime
模块的教程,但没有使用 time
模块的教程。
我该怎么做?有没有更好的方法来获取今天的日期 (struct_time
)?
如果给定了 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)
首先,有一种更直接的方法来获取当前日期:
dt = time.localtime()
要获得前一天的日期,您需要从当前时间减去 24 小时。这可能会在夏令时转换过程中出现一些问题,但我会将这些问题留作 reader.
的练习。
dt = time.localtime(time.time() - 86400)
要获得昨天的 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 月跳过了几天)那么日期无论如何都是正确的。
我正在尝试使用 Python 的 time
模块获取今天和昨天的时间。
这对我来说适用于今天的日期:
dt = time.strptime(time.strftime("%d/%m/%Y"),'%d/%m/%Y')
但是我不知道如何得到昨天的日期。
我发现许多使用 datetime
模块的教程,但没有使用 time
模块的教程。
我该怎么做?有没有更好的方法来获取今天的日期 (struct_time
)?
如果给定了 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)
首先,有一种更直接的方法来获取当前日期:
dt = time.localtime()
要获得前一天的日期,您需要从当前时间减去 24 小时。这可能会在夏令时转换过程中出现一些问题,但我会将这些问题留作 reader.
的练习。dt = time.localtime(time.time() - 86400)
要获得昨天的 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 月跳过了几天)那么日期无论如何都是正确的。