在使用 Python 处理时间戳与系统时间转换时,遇到一些问题,解决后除了对问题的总结,也想把 Python 处理时间的各种情况都总结一下,慢慢更新补全,以便以后查阅
获取时间戳
1 2 3 4 5 6 7 8 9 10 11 12
| #!/usr/bin/env python # -*- coding:utf-8 -*- # Author: wxnacy([email protected])
import time from datetime import datetime from datetime import timezone
print(time.time()) # ==> 1 1512894925.029236 print(datetime.now().timestamp()) # ==> 2 1512894925.029236 dt = datetime.utcnow() print(dt.replace(tzinfo=timezone.utc).timestamp()) # ==> 3 1512894925.029236
|
三种方法得到的结果都是一样的,之所以列举第三种这个麻烦的方法,是因为我之前存在一个误区,认为 datetime.utcnow().timestamp()
得到的结果就是 Unix 时间戳,详细请见我的文章 Python 时间戳的坑
时间戳转系统时间
1 2 3 4 5 6 7 8 9 10
| #!/usr/bin/env python # -*- coding:utf-8 -*- # Author: wxnacy([email protected])
import time from datetime import datetime
ts = 1512894925 print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(ts))) print(datetime.fromtimestamp(ts).strftime("%Y-%m-%d %H:%M:%S"))
|
系统时间转时间戳
1 2 3 4 5 6 7 8 9 10
| #!/usr/bin/env python # -*- coding:utf-8 -*- # Author: wxnacy([email protected])
import time from datetime import datetime
t = '2017-12-10 16:37:17' print(int(time.mktime(time.strptime(t, '%Y-%m-%d %H:%M:%S')))) print(datetime.strptime(t, '%Y-%m-%d %H:%M:%S').timestamp())
|
时间格式化符号
- %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)
- %f 毫秒(000-999)
- %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 当前时区的名称
- %% %号本身
使用技巧
1 2 3 4 5 6 7 8 9 10 11
| #!/usr/bin/env python # -*- coding:utf-8 -*- # Author: wxnacy([email protected])
from datetime import date
day = date(2018, 03, 25).timetuple() # 获取指定日期为当前星期的第几天 print(day.tm_wday + 1) # 7 # 获取指定日期为当年的第几天 print(day.tm_yday) # 84
|
date/time 转为 datetime
1 2 3 4
| >>> from datetime import datetime >>> from datetime import date >>> datetime.combine(date.today(), datetime.min.time()) datetime.datetime(2018, 4, 28, 0, 0)
|
参考资料