如何*更改*结构时间对象?

2024-04-18 16:36:10 发布

您现在位置:Python中文网/ 问答频道 /正文

在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(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很好,但是如何创建呢?有什么办法?


Tags: time时间secmin结构yearstructtm
3条回答

所以。。。文档中给出了元组基础时间结构的架构: http://docs.python.org/2/library/time.html#time.struct_time

即使它作为时间结构是只读的,您也可以使用casting to list()直接获取该元组(记住在您增加元组后将其括起来,并将结束范围保持在1-12而不是0-11)。然后time.struct_time()函数将有效的9元组转换回时间结构:

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))

使用^{} module代替,它有更丰富的对象集来处理日期(时间)算法:

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

您可以使用优秀的^{} add-on module来获得处理增量的更丰富的选项集:

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

relativedelta知道闰年、月长等,并且在1月30日(比如2月28日或29日结束,不会跨越月边界)添加一个月时会做正确的事情。

您可以先将其转换为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

相关问题 更多 >