时间戳 ↔ 格式化时间、时间差计算 (Python)
直接输出格式化时间
import time
print(time.strftime("%Y-%m-%d %H:%M:%S"))
# 2021-05-28 13:10:42
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
# 2021-05-28 13:10:42
获取【秒级】、【毫秒级】、【微秒级】时间戳
import time
now = time.time()
import time
now = time.time()
print(now)
# 得到:1607046750.3136647
# 整数10位,小数6位,已经精确到【微秒级】
这里说一下个人的理解(如果不对,希望各位看官能够在评论区有理有据地喷我):
time.time()获取的小数为当前时间戳,表示从1970年1月1日起至执行操作时的总秒数。小数点前的是整秒数,小数点后地部分是不足一秒的计量,依次是十分之一秒、百分之一秒,… 。平时说的毫秒就是千分之一秒,既然要精确到毫秒,那么就需要对万分之一秒进行四舍五入,这样就拿到了精确的毫秒;同理,微秒(百万分之一秒)也是这样的,需要对千万分之一秒进行四舍五入。这也就是为什么小数点后有7位小数,而不是六位。
格式化时间 → 时间戳
格式化字符串(秒级) → 时间戳(10位)
import time
def str_second_datetime2int_10timestamp(str_second_datetime):
"""将字符串型【秒级】格式化时间 转为 【10位】整型时间戳"""
ans_time_stamp = int(time.mktime(time.strptime(str_second_datetime, "%Y-%m-%d %H:%M:%S")))
return ans_time_stamp
print(str_second_datetime2int_10timestamp('2019-08-17 18:39:15'))
# 得到:1566038355
格式化字符串(毫秒级) → 时间戳(13位)
import time
from datetime import datetime
def str_microsecond_datetime2int_13timestamp(str_microsecond_datetime):
"""将字符串型【毫秒级】格式化时间 转为 【13位】整型时间戳"""
datetime_obj = datetime.strptime(str_microsecond_datetime, "%Y-%m-%d %H:%M:%S.%f")
obj_stamp = int(time.mktime(datetime_obj.timetuple()) * 1000.0 + datetime_obj.microsecond / 1000.0) / 1000.0
return obj_stamp
print(str_microsecond_datetime2int_13timestamp('2019-08-17 18:39:15.456'))
# 得到:1566038355456
时间戳 → 格式化时间
import time
import datetime
def int2datetime(int_float_timestamp):
"""
有小数点:分离小数点,整数转为格式化时间,小数点直接跟在后面
无小数点:从第10位进行分离,
所以本函数只适用于时间戳整数位数大于9且小于11.
"""
if '.' in str(int_float_timestamp):
int_float = str(int_float_timestamp).split('.')
date = time.localtime(int(int_float[0]))
tempDate = time.strftime("%Y-%m-%d %H:%M:%S", date)
secondafter = '.' + str(int_float[1])
return str(tempDate) + secondafter
else:
if len(str(int_float_timestamp)) == 10:
# 精确到秒
timeValue = time.localtime(int_float_timestamp)
tempDate = time.strftime("%Y-%m-%d %H:%M:%S", timeValue)
datetimeValue = datetime.datetime.strptime(tempDate, "%Y-%m-%d %H:%M:%S")
elif 10 < len(str(int_float_timestamp)) and len(str(int_float_timestamp)) < 15:
# 精确到毫秒
k = len(str(int_float_timestamp)) - 10
timetamp = datetime.datetime.fromtimestamp(int_float_timestamp / (1 * 10 ** k))
datetimeValue = timetamp.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]
elif 14 < len(str(int_float_timestamp)) and len(str(int_float_timestamp)) < 18:
# 精确到毫秒
k = len(str(int_float_timestamp)) - 10
timetamp = datetime.datetime.fromtimestamp(int_float_timestamp / (1 * 10 ** k))
datetimeValue = timetamp.strftime("%Y-%m-%d %H:%M:%S.%f")
else:
return -1
return datetimeValue
print(int2datetime(1607046750)) # 2020-12-04 09:52:30
print(int2datetime(1607046750.313)) # 2020-12-04 09:52:30.313
print(int2datetime(1607046750.3136647)) # 2020-12-04 09:52:30.3136647
print(int2datetime(1607046750313)) # 2020-12-04 09:52:30.313
print(int2datetime(16070467503136647)) # 2020-12-04 09:52:30.313665
符号含义
符号 | 含义 |
---|---|
%y | 两位数的年份表示(00-99) |
%Y | 四位数的年份表示(000-9999) |
%m | 月份(01-12) |
%d | 月内中的一天(0-31) |
%H | 24小时制小时数(0-23) |
%I | 12小时制小时数(01-12) |
%M | 分钟数(00=59) |
%S | 秒(00-59) |
%a | 本地简化星期名称 |
%A | 本地完整星期名称 |
%b | 本地简化的月份名称 |
%B | 本地完整的月份名称 |
%c | 本地相应的日期表示和时间表示 |
%j | 年内的一天(001-366) |
%p | 本地A.M.或P.M.的等价符 |
%U | 一年中的星期数(00-53)星期天为星期的开始 |
%w | 星期(0-6),星期天为星期的开始 |
%W | 一年中的星期数(00-53)星期一为星期的开始 |
%x | 本地相应的日期表示 |
%X | 本地相应的时间表示 |
%Z | 当前时区的名称 |