17

在 python 中处理时间和日期时,您会偶然发现 time.struct_time 对象:

st = time.strptime("23.10.2012", "%d.%m.%Y")
print st
time.struct_time(tm_year=2012, tm_mon=10, tm_mday=23, tm_hour=0, tm_min=0,
                 tm_sec=0, tm_wday=1, tm_yday=297, tm_isdst=-1)

现在,由于这个结构不支持项目分配(即你不能做类似的事情st[1]+=1),否则怎么可能增加月份的数量。

解决方案建议把这个time_struct转换成秒,加上对应的秒数,但是这样看起来不太好看。您还需要知道一个月有多少天,或者这一年是否是闰年。我想要一个简单的方法来获得一个 time_struct 例如

time.struct_time(tm_year=2012, tm_mon=11, tm_mday=23, tm_hour=0, tm_min=0,
                 tm_sec=0, tm_wday=1, tm_yday=297, tm_isdst=-1)

只是一个月增加了一个。time_struct从头开始创建一个很好 - 但是如何?有哪些方法?

4

4 回答 4

23

请改用该datetime模块,该模块具有更丰富的对象集来处理日期(时间)算术:

import datetime
adate = datetime.datetime.strptime("23.10.2012", "%d.%m.%Y").date()
adate + datetime.timedelta(days=30)

您可以使用出色的python-dateutil附加模块来获得更丰富的选项来处理增量:

from dateutil.relativedelta import relativedelta
adate + relativedelta(months=1)

relativedelta了解闰年、月份长度等,并且在将月份添加到 1 月 30 日时会做正确的事情(您最终会得到 2 月 28 日或 29 日,它不会跨越月份界限)。

于 2012-10-23T13:34:22.430 回答
12

所以...底层 time_struct 元组的模式在此处的文档中给出:http: //docs.python.org/2/library/time.html#time.struct_time

即使它作为 time_struct 是只读的,您也可以使用强制转换为 list() 直接获取该元组(请记住在增加月份后环绕您的月份,并将结束范围保持在 1-12 而不是 0 -11)。然后该time.struct_time()函数会将有效的 9 元组转换回 time_struct:

st = time.strptime("23.10.2012", "%d.%m.%Y")
st_writable = list(st)
st_writable[1] = (st_writable[1] + 1)%12 + 1
st = time.struct_time(tuple(st_writable))
于 2013-06-20T18:06:53.870 回答
2

您可以先将其转换为日期时间,然后为其添加 timedelta 偏移量:

from time import mktime
from datetime import datetime

dt = datetime.fromtimestamp(mktime(struct))
timedelta = datetime.timedelta(seconds=10)
dt = dt + timedelta

参考:

  1. 如何将 Python time.struct_time 对象转换为 datetime 对象?
  2. http://docs.python.org/library/datetime.html
于 2012-10-23T13:36:48.700 回答
1

如果您想同时避免使用日期时间并坚持使用时间,您可以转换为 unix 时间戳,然后减去所需的秒数。要获取 24 小时前的时间对象:

time.gmtime(time.mktime(time.gmtime()) - 86400)

但是,正如 OP 指出的那样,这不适合几个月的工作,应该保留几秒钟、几小时和几天。

于 2016-05-12T19:42:54.157 回答