專 欄
❈
gw1770df,Python中文社区专栏作者,从事Python开发工作,全栈工程师。
博客:
Github:
❈
—
—
处理时间是工作中非常常见的操作,最基本的获取当前时间,格式化时间,计算两个时间差,时间戳转换等等.
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.
6. `now = datetime.datetime.now()`
7. `print now.strftime('%Y-%m-%d %H:%M:%S')`
8. `# 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为日期时间对象,最小精度为妙(毫秒也可以)
实际使用中按需选择。
- 计算2016-12-1和1990-1-1中间天数和秒数
- `dt = datetime . date ( 2016 , 12 , 1 )
datetime . date ( 1990 , 1 , 1 )`
- `dt . days
# 将字符串转换为datetime.date对象
- `dt_a = datetime . datetime . strptime ( '2016-12-1' ,
'%Y-%m-%d' )
- `dt_b = datetime . datetime . strptime ( '1990-1-1' ,
'%Y-%m-%d' )
# 但是反格式化时一位月份也可工作
- `dt = dt_a
dt_b10.
dt
.
days
- `dt . total_seconds ()
- 计算两个时间戳间隔时间
- `timestamp_a , timestamp_b =
1480582517 ,
2.
dtdatetime . datetime . fromtimestamp ( timestamp_a )
datetime . datetime . fromtimestamp ( timestamp_b )`
print dt . days , dt . total\_seconds ()
# 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`
个人认为时间戳才是最有魅力的
六. 各种数据类型间转换
- str > datetime.datetime
- `datetime . datetime . strptime ( '161201 16:14:22' ,
'%y%m%d %H:%M:%S' )`
- str > 时间元组
- `dt = datetime . datetime . strptime ( '161201 16:14:22' ,
'%y%m%d %H:%M:%S' )`
dt . timetuple ()
# or
- `struct_time = time . strptime ( '161201 16:14:22' ,
'%y%m%d %H:%M:%S' )`
-
时间戳 > datetime.datetime 或 datetime.date
-
datetime . datetime . fromtimestamp (时间戳)
-
# or
-
datetime . date . fromtimestamp (时间戳)
-
时间戳 > 时间元组
-
time . gmtime (时间戳)
-
时间元组 > 时间戳
-
time . mktime (时间戳)
-
时间元组 > datetime.datetime 或 datetime.date
-
datetime . datetime . fromtimestamp ( time . mktime (时间元组))
-
# or
-
datetime . date . fromtimestamp ( time . mktime (时间元组))
-
时间戳 > 时间元组
-
time . gmtime (时间戳)
-
# or
-
dt = datetime . datetime . fromtimestamp (时间戳)
-
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-23 | 00,01...23 |
%I | 小时 01-12 | 01,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中文社区
致力于成为
国内最好的Python社区
QQ群:152745094
专栏作者申请邮箱
— Life is short,we use Python —