如何*更改* struct_time对象?

时间:2012-10-23 13:29:46

标签: python time

在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 个答案:

答案 0 :(得分:20)

使用datetime module代替,它具有更丰富的对象集来处理日期(时间)算术:

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

你可以使用优秀的python-dateutil add-on module来获得更丰富的选项来处理增量:

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

relativedelta知道闰年,月份长度等,并且在1月30日添加一个月时会做正确的事(你最终会在2月28日或29日结束,它不会越过月份边界)。

答案 1 :(得分:9)

所以......这里的文档中给出了基于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))

答案 2 :(得分:1)

您可以先将其转换为datetime,然后为其添加timedelta偏移量:

from time import mktime
from datetime import datetime

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

参考文献:

  1. How do you convert a Python time.struct_time object into a datetime object?
  2. http://docs.python.org/library/datetime.html

答案 3 :(得分:0)

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

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

然而,正如OP指出的那样,这对于使用几个月并不好,应该保留几秒,几小时和几天。