专栏名称: Python中文社区
致力于成为国内最好的Python开发者学习交流平台,这里有关于Python的国内外最新消息,每日推送有趣有料的技术干货和社区动态。 官方网站:www.python-cn.com
目录
相关文章推荐
Python爱好者社区  ·  20个python3项目源码 ·  5 天前  
Python爱好者社区  ·  最近招了个浑身软肋的优质员工:房贷150万, ... ·  5 天前  
Python爱好者社区  ·  大模型最佳实践.pdf ·  6 天前  
Python爱好者社区  ·  python速成手册 ·  6 天前  
Python爱好者社区  ·  越来越多的人开始讨厌15薪。 ·  6 天前  
51好读  ›  专栏  ›  Python中文社区

Python时间处理完全手册

Python中文社区  · 公众号  · Python  · 2016-12-08 21:42

正文

專 欄

gw1770df,Python中文社区专栏作者,从事Python开发工作,全栈工程师。

博客:

https://word.gw1770df.cc

Github:

https://github.com/gw1770df

处理时间是工作中非常常见的操作,最基本的获取当前时间,格式化时间,计算两个时间差,时间戳转换等等. 
Python内置两个非常常用的时间处理库 
time 和datetime,足以满足工作中的各种需求。 
datetime 功能更加强大, time 库就较为简练一些。 
两个库互补使用,所有问题迎刃而解。

官方文档Python2.7 datetime(https://docs.python.org/2/library/datetime.html?highlight=datetime#module-datetime) 和 time(https://docs.python.org/2/library/time.html?highlight=time#module-time)

注意:time 或者 datetime 库需要提前import

WIKI:

UNIX时间,或称POSIX时间是UNIX或类UNIX系统使用的时间表示方式:从协调世界时1970年1月1日0时0分0秒起至现在的总秒数,不考虑闰秒。 在多数Unix系统上Unix时间可以通过date +%s指令来检查。

各地日期和时间表示法:yyyy = 年份,mm = 月份,dd = 日期,MMM = 月份三字母缩写,mmmm = 月份全名,hr = 小时,mi = 分钟,se = 秒钟 
国际标准ISO 8601:yyyy-mm-dd,hr:mi:se(24小时制) 
中国:yyyy年m月d日;hr时mi分se秒;hr:mi:se(12/24小时制) 
美国:mm/dd/yyyy;mm/dd/yy;mmmm dd, yyyy;hr:mi:se(12小时制) 
澳大利亚:dd/mm/yyyy;MMM dd, yyyy;hr:mi:se a.m./p.m.(12/24小时制)

时区是地球上的区域使用同一个时间定义。以前,人们通过观察太阳的位置(时角)决定时间,这就使得不同经度的地方的时间有所不同(地方时)。1863年,首次使用时区的概念。时区通过设立一个区域的标准时间部分地解决了这个问题。

一. 获取并格式化时间

使用time模块获取当前时间

  1. print time.strftime('%Y-%m-%d %H:%M:%S')

  2. # Out: '2016-12-01 16:10:27'

使用datetime模块获取当前日期和当前时间

  1. # 获取当前日期

  2. today = datetime.date.today()

  3. print today.strftime('%Y-%m-%d')

  4. # Out: '2016-12-01'  # 获取当前日期


  5. now = datetime.datetime.now()

  6. print now.strftime('%Y-%m-%d %H:%M:%S')

  7. # Out: '2016-12-01 16:14:22' # 获取当前日期时间

二. 转换时间格式

例如我们拿到了一个时间字符串 161201 16:14:22 需要将其转换成其他格式。

  1. struct_time = time.strptime('161201 16:14:22', '%y%m%d %H:%M:%S')

  2. # struct_time 为一个时间元组对象

  3. print time.strftime('%Y-%m-%d %H:%M:%S', struct_time)

  4. # Out: '2016-12-01 16:14:22'

  1. dt = datetime.datetime.strptime('161201 16:14:22', '%y%m%d %H:%M:%S')

  2. # dt 为 datetime.datetime对象  # 通过调用 timetuple()方法将datetime.datetime对象转化为时间元组

  3. print dt.strftime('%Y-%m-%d %H:%M:%S')

  4. # Out: '2016-12-01 16:14:22'

三. 计算两个时间间隔

计算时间间隔使用datetime模块比较方便。 
datetime.date为日期对象,最小精度为天。 
datetime.datetime为日期时间对象,最小精度为妙(毫秒也可以) 
实际使用中按需选择。

  1. 计算2016-12-1和1990-1-1中间天数和秒数

    1. dt = datetime.date(2016,12,1) - datetime.date(1990,1,1)

    2. dt.days # 间隔天数


    3. # 将字符串转换为datetime.date对象


    4. dt_a = datetime.datetime.strptime('2016-12-1', '%Y-%m-%d') # datetime.date 无 strptime 方法

    5. dt_b = datetime.datetime.strptime('1990-1-1', '%Y-%m-%d') # 虽然格式化时间的时候%m为两位数月份

    6.                                                        # 但是反格式化时一位月份也可工作

    7. dt = dt_a - dt_b

    8. dt.days # 为 间隔天数

    9. dt.total_seconds() # 为 间隔秒数

  2. 计算两个时间戳间隔时间

    1. timestamp_a, timestamp_b = 1480582517, 1480472517

    2. dt = datetime.datetime.fromtimestamp(timestamp_a) - datetime.datetime.fromtimestamp(timestamp_b)

    3. print dt.days, dt.total_seconds()


    4. # Out: 1 110000.0

四. 获取前N天,或者后N天时间

datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])

  1. now = datetime.datetime.now()

  2. before_time = now - datetime.timedelta(days=1)

  3. after_time = now + datetime.timedelta(days=1)

  4. print before_time

  5. # Out: 2016-11-30 17:03:40.420000

  6. print after_time

  7. # Out: 2016-12-02 17:03:40.420000

五. 时间戳相关计算

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。 
通过时间戳可以快速直接得到很多信息

  1. ts = int(time.time()) # ts = 1480583196

  2. print ts / 86400 % 7 + 3 # 获取时间戳对应的星期 0 周日 - 6 周六

  3. # Out: 3 # 周四

  4. # ===============

  5. timestamp_a, timestamp_b = 1480582517, 1480472517

  6. ts = timestamp_a - timestamp_b

  7. print ts / 86400 # 获取两个时间戳相隔天数

  8. # ===============

  9. # 获取当天00:00:00的时间戳

  10. ts = int(time.time())

  11. print ts / 86400 * 86400

  12. # Out: 1480550400

  13. # ===============

  14. # 获取当天23:59:59的时间戳

  15. ts = int(time.time())

  16. print ts / 86400 * 86400 + 86400 - 1

  17. # Out: 1480636799

个人认为时间戳才是最有魅力的

六. 各种数据类型间转换

  1. str > datetime.datetime

    1. datetime.datetime.strptime('161201 16:14:22', '%y%m%d %H:%M:%S')

  2. str > 时间元组

    1. dt = datetime.datetime.strptime('161201 16:14:22', '%y%m%d %H:%M:%S')

    2. dt.timetuple()


    3. # or


    4. struct_time = time.strptime('161201 16:14:22', '%y%m%d %H:%M:%S')

  3. 时间戳 > datetime.datetime 或 datetime.date

    1. datetime.datetime.fromtimestamp(时间戳)


    2. # or


    3. datetime.date.fromtimestamp(时间戳)

  4. 时间戳 > 时间元组

    1. time.gmtime(时间戳)

  5. 时间元组 > 时间戳

    1. time.mktime(时间戳)

  6. 时间元组 > datetime.datetime 或 datetime.date

    1. datetime.datetime.fromtimestamp(time.mktime(时间元组))


    2. # or


    3. datetime.date.fromtimestamp(time.mktime(时间元组))

  7. 时间戳 > 时间元组

    1. time.gmtime(时间戳)


    2. # or


    3. dt = datetime.datetime.fromtimestamp(时间戳)

    4. dt.timetuple()

七、格式化与反格式化控制字符对照表

字符含义例子
%a当地格式的星期缩写Sun,Mon...Sat(en_US);So,Mo...Sa(de_DE)
%A当地格式的星期全拼Sunday,Monday...Saturday(en_US);Sonntag,Montag...Samstag(de_DE)
%w星期的数字表示0表示周日,6表示周六0,1...6
%d日,当月第几天,两位数01,02...31
%b当地格式的月份缩写Jan,Feb...Dec(en_US);Jan,Feb...Dez(de_DE)
%B当地格式的月份全拼January, February,...,December(en_US);Januar,Februar...Dezember(de_DE)
%m月份的数字表示,两位数01,02...12
%y年份表示,不带世纪,两位数00,01...99
%Y年份表示1970,1971...2016
%H小时 0-2300,01...23
%I小时 01-1201,02...12
%p当地格式的上午下午表示AM,PM(en_US);am,pm(de_DE)
%M分钟,两位数00,01...59
%S秒,两位数00,01...59
%f微妙,六位数000000,000001...999999
%z时区偏移量,表示为+HHMM或-HHMM或空(空),+0000,-0400,+0800
%Z时区名字(空),UTC, EST, CST
%j日,当年第几天,三位数001,002...366
%U周,在年第几周,周日为一周的第一天,新年第一个星期日第0周,两位数00,01...53
%W周,在年第几周,周一为一周的第一天,新年第一个星期一第0周,两位数00,01...53
%c当地格式的时间日期表示Tue Aug 16 21:30:00 1988 (en_US);Di 16 Aug 21:30:00 1988 (de_DE)
%x当地格式的日期表示08/16/88 (None);08/16/1988 (en_US);16.08.1988 (de_DE)
%X当地格式的时间表示21:30:00 (en_US);21:30:00 (de_DE)
%%%字符%

ARTICLES
近期热门文章


生成器

关于生成器的那些事儿

爬虫代理

如何构建爬虫代理服务

地理编码

怎样用Python实现地理编码

nginx日志

使用Python分析nginx日志


淘宝女郎

一个批量抓取淘女郎写真图片的爬虫

IP代理池

突破反爬虫的利器——开源IP代理池

布隆去重

基于Redis的Bloomfilter去重(附代码)

内建函数

Python中内建函数的用法

QQ空间爬虫

QQ空间爬虫最新分享,一天 400 万条数据

对象

Python教你找到最心仪对象

线性回归

Python机器学习算法入门之梯度下降法实现线性回归

匿名代理池

进击的爬虫:用Python搭建匿名代理池

在公众号底部回复上述关键词可直接打开相应文章


我 们 终 将 改 变 潮 水 的 方 向

§§

Python中文社区
www.python-cn.com

致力于成为

国内最好的Python社区


QQ群:152745094

专栏作者申请邮箱

[email protected]

— Life is short,we use Python —