故事同样起源于工作:
针对这个坑,事实上处理的方法也比较简单:
但是,其中却也暴露了我对于datetime库使用上的不熟练,因此,这里就搞篇小水文来整理一下下面两个和时间相关的库吧:
为了避免又像之前的文章那样变成文档翻译,这里,我们先大致介绍一下其中的一些常用函数,然后用两个实际的case来进行一下说明。
这里,我们先来看一下time库当中的一些常用的函数。
time.time()
time.sleep(secs)
secs
秒后重启线程继续运行程序。time.asctime([t])
time.localtime([secs])
struct_time
类型的时间进行返回,如果secs为空,则默认值为当前的时间,即time.time()
的结果。time.strftime(format, [t])
tuple
或者struct_time
类型)转换为string类型并进行答应,其中format为自定义的显示格式,如:"%Y-%m-%d %H:%M:%S %a %Z(%z)"
,展示为:2021-01-28 13:44:07 Thu CST(+0800)
,更多的参数定义可以参考官网文档。同样的,我们给出一些常用的datetime库中的方法如下:
datetime.datetime.now()
datetime.datetime.utcnow()
datetime.datetime.timedelta()
datetime.strftime()
datetime.timestamp()
这里,我们来给出一个简单的装饰器,用以实现函数运行失败时的自动retry过程。
def retry(retry_time=3, fix_time=5):
def decorator(func):
def fn(*args, **kwargs):
for i in range(retry_time):
try:
return func(*args, **kwargs)
except:
print(f"function {func.__name__ } failed {i+1} times.")
time.sleep(fix_time)
raise Exception(f"function {func.__name__ } still failed after {retry_time} times retry.")
return fn
return decorator
同样,我们同样可以使用装饰器的方式对任意一个函数返回执行时间。
def count_time(func):
def fn(*args, **kwargs):
t1 = time.time()
res = func(*args, **kwargs)
t2 = time.time()
print(f"function {func.__name__} cost time: {t2-t1:.2} secs")
return res
return fn
我们给出一个获取北京时间的通用方法如下:
def get_time(time_format="%Y-%m-%d %H:%M:%S"):
peiking_time = datetime.timezone(
datetime.timedelta(hours=8),
name='PeiKing Time',
)
utc_time = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)
return utc_time.strftime(time_format)
特别地,如果需要获取的时间上有一个平移量,我们只需要稍微调整一下代码即可:
def get_time(delta=0, time_format="%Y-%m-%d %H:%M:%S"):
peiking_time = datetime.timezone(
datetime.timedelta(hours=8),
name='PeiKing Time',
)
utc_time = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)
t = utc_time.astimezone(peiking_time) + datetime.timedelta(delta)
return t.strftime(time_format)