时间戳可简单理解为自1970/01/01/ 00:00:00 到现在经过的秒数,如果要计算日期运算,因为涉及到润年,一般使用语言自带的库实现比较简单和高效。但如果只是取时间即时分秒,完全可以不用依赖库,通过模运算和取整运算的方式实现,并且性能比内部库函数效率更高。
逻辑如下
- 计算当天相对于0点经过的秒数:时间戳用86400取模(北京时间相对于utc时间要加8个小时后再取模);
- 计算小时:用当天的秒数除以3600 向下取整,获得当天的小时数;
- 计算分: 用当天的秒数按3600取模,再除以60 向下取整,获得分钟数;
- 计算秒: 用当天的秒数按60取模
python 实现代码如下:
import time
def time_format(utc_timestamp: int):
# 转换成北京时间的某一天的秒数
days = (utc_timestamp + 3600 * 8) % 86400
hours = int(days / 3600)
minutes = int(days % 3600 / 60)
seconds = days % 60
# 格式化输出 格式类似 %H:%M:%S eg: 03:05:02,13:55:21
time_str = f"{hours:02d}:{minutes:02d}:{seconds:02d}"
return time_str
def time_format_lib(utc_timestamp: int):
return time.strftime("%H:%M:%S", time.localtime(utc_timestamp))
if __name__ == "__main__":
# 调用100w次对比性能
utc_timestamp = int(time.time())
start_time = time.perf_counter()
for _ in range(10**6):
time_format_lib(utc_timestamp)
print(f"标准库运算用时:{time.perf_counter() - start_time}")
start_time = time.perf_counter()
for _ in range(10**6):
time_format(utc_timestamp)
print(f"取模运算格式化用时:{time.perf_counter() - start_time}")
运行结果,100万次
1000万次
性能快了接近200%,如果有涉及到大数据分析场景,百万甚至千万级别次的调用时,该算法还是有意义的