在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
会很好 - 但是如何?有什么方法?
答案 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
参考文献:
答案 3 :(得分:0)
如果你想一起避免日期时间并坚持使用时间,你可以转换为unix时间戳,然后减去你需要的秒数。要在24小时前获得时间对象:
time.gmtime(time.mktime(time.gmtime()) - 86400)
然而,正如OP指出的那样,这对于使用几个月并不好,应该保留几秒,几小时和几天。