time和datetime和tzinfo

time和datetime模块还有tzinfo (时区)(一直不明白两者的区别,然后摘了两片文章(最后面的两个链接),很清晰...)

一、time模块

常用函数

1. time()函数

time()函数返回的是时间戳(timestamp)。所谓时间戳指的是从1970年1月1日00:00:00开始按秒计算的偏移量。其他返回时间戳方式的函数还有clock()。

实例

>>>import time
>>>time.time()
1515117751.8810253

2. ctime()函数

ctime()函数可以将一个时间戳转化为字符串的形式,默认time.time()为参数。(convert time in seconds to string)

实例

>>>import time
>>>time.ctime()
'Fri Jan  5 10:21:29 2018'
>>>time.ctime(1500000000)
'Fri Jul 14 10:40:00 2017'

4.gmtime()函数

gmtime()用于获取UTC时间,UTC时间实际就是格林尼治时间,它与中国时间的时差为八个小时。

实例

>>>import time
>>>time.gmtime()
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=5, tm_hour=3, tm_min=27, tm_sec=18, tm_wday=4, tm_yday=5, tm_isdst=0)

5. localtime()函数

localtime()用于获取当前时区的当前时间。

实例

>>>import time
>>>time.localtime()
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=5,tm_hour=11, tm_min=28, tm_sec=48, tm_wday=4, tm_yday=5, tm_isdst=0)

6. strftime()函数

strftime()把一个代表时间的元组或者struct_time(如time.localtime()和time.gmtime()返回)转化为格式化的时间字符串。如果t未指定,将传入time.localtime()。

实例

>>> time.strftime("%Y-%m-%d %X")
'2018-01-05 11:20:21'
>>> time.strftime("%Y-%m-%d %H:%M:%S")
'2018-01-05 11:21:30'
>>> time.strftime("%Y-%m-%d %X", time.localtime())
'2018-01-05 11:23:04'

* format time格式化表示*

格式含义
%Y 完整的年份
%m 月份(01 - 12)
%d 一个月中的第几天(01 - 31)
%H 一天中的第几个小时(24小时制,00 - 23)
%M 分钟数(00 - 59)
%S 秒(01 - 61)
%X 本地相应时间
%x 本地相应日期
%a 本地(locale)简化星期名称
%A 本地完整星期名称
%b 本地简化月份名称
%B 本地完整月份名称
%c 本地相应的日期和时间表示
%I 第几个小时(12小时制,01 - 12)
%j 一年中的第几天(001 - 366)
%p 本地am或者pm的相应符
%U 一年中的星期数。(00 - 53星期天是一个星期的开始。)
%w 一个星期中的第几天(0 - 6,0是星期天)
%W 和%U基本相同,不同的是%W以星期一为一个星期的开始
%y 去掉世纪的年份(00 - 99)
%Z 时区的名字(如果不存在为空字符)
%% ‘%’字符

注:表中加粗部分为最常用格式

7. strptime()函数

strptime()把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作

实例

>>>import time
>>>time.strptime('2018-01-05 10:50:06','%Y-%m-%d %X')       
time.struct_time(tm_year=2018,tm_mon=1,tm_mday=5,tm_hour=10,tm_min=50,tm_sec=6, tm_wday=4, tm_yday=5, tm_isdst=-1)

8. mktime()函数

mktime()可以将struct_time转换成用时间的浮点数表示

实例

>>> time.mktime(time.gmtime())
1515094387.0
>>> time.mktime(time.localtime())
1515123246.0

9. sleep()函数

线程推迟指定的时间运行,单位为秒。

import time
>>> time.sleep(3) #表示延迟3秒后程序继续运行

小结:

time模块中时间表现的格式主要有3种:
1. timestamp 时间戳
2. tuple或者struct_time 时间元组,共有九个元素组
3. formattime格式化字符串

它们之间的转化如图所示
这里写图片描述

 

二、datetime模块

datetime模块包含一个datetime类,通过from datetime import datetime导入的就是datetime这个类。

常见操作

1. 获取当前日期

>>> from datetime import datetime
>>> now = datetime.now()
>>> now
datetime.datetime(2018, 1, 5, 16, 2, 47, 929705)
>>> print(now)
2018-01-05 16:02:47.929705

 

2. 获取指定日期和时间

>>> from datetime import datetime
>>> dt=datetime(2018, 1, 1, 1, 1)
>>> print(dt)
2018-01-01 01:01:001

3. datetime类型转换为timestamp

只需要简单调用timestamp()方法

>>> from datetime import datetime
>>> dt=datetime(2018, 1, 1, 1, 1)
>>> dt.timestamp()
1514739660.0

4. timestamp转换为datetime

使用datetime提供的fromtimestamp()方法

>>> from datetime import datetime
>>> t = 1514739660.0
>>> print(datetime.fromtimestamp(t))
2018-01-01 01:01:00

5. str转换为datetime

当日期和时间为字符串时,需要把str转换为datetime,可通过datetime.strptime()实现。

>>> from datetime import datetime
>>> dt= datetime.strptime('2018-1-1 1:11:11', '%Y-%m-%d %H:%M:%S')
>>> print(dt)
2018-01-01 01:11:11

6. datetime转换为str

如果已经有了datetime对象,要把它格式化为字符串显示给用户,就需要转换为str,转换方法是通过strftime()实现的。

>>> from datetime import datetime
>>> now = datetime.now()
>>> now
datetime.datetime(2018, 1, 5, 16, 22, 50, 394736)
>>> now.strftime('%Y-%m-%d %H:%M:%S')
'2018-01-05 16:22:50'

7. datetime加减

对日期和时间进行加减需要导入timedelta这个类

>>> from datetime import datetime, timedelta
>>> now = datetime.now()
>>> now
datetime.datetime(2018, 1, 5, 16, 22, 50, 394736)
>>> now + timedelta(hours=10)
datetime.datetime(2018, 1, 6, 2, 22, 50, 394736)
>>> now - timedelta(days=10)
datetime.datetime(2017, 12, 26, 16, 22, 50, 394736)
>>> now + timedelta(days=10, hours=12)
datetime.datetime(2018, 1, 16, 4, 22, 50, 394736)
>>> (now + timedelta(days=10, hours=12)).total_seconds()
把timedelta转成时间戳
 

8.时区tzinfo

TypeError: can't compare offset-naive and offset-aware datetimes

# 这是因为两个时间不属于同一类型,offset-naive是不含时区的类型,而offset-aware是有时区类型,两者自然不能比较。

# 我们可以通过判断datetime对象的tzinfo属性,来获悉他是何种类型

import datetime
 
import pytz
 
now=datetime.datetime.now() # datetime.datetime(2016, 11, 13, 16, 23, 37, 488000)
 
now.tzinfo==None #True

# 上述代码中now就是一个offset-naive型,就是一个不含时区的datetime。下面代码可以把它转换为一个含时区的offset-aware型:

now=now.replace(tzinfo=pytz.timezone('UTC')) # datetime.datetime(2016, 11, 13, 16, 23, 37, 488000, tzinfo=<UTC>)
# 同样的,将一个offset-aware型转换为offset-naive型:
now=now.replace(tzinfo=None)

  

小结

datetime模块定义了5个类:

序号含义
1 datetime.datetime 表示日期时间的类
2 datetime.timedelta 表示时间间隔,即两个时间点的间隔
3 datetime.date 表示日期的类
4 datetime.time 表示时间的类
5 datetime.tzinfo 时区的相关信息

 

 

 

# 因为数据库都是有时区'UTC'的datetime类型,
# 所以先转换成无时区的类型now.replace(tzinfo=None))
# 然后datetime.timedelta().total_seconds()获取时间差,然后获取时间戳(数字 )
now = datetime.datetime.now()
minus_time = (now - token_obj.created.replace(tzinfo=None)).total_seconds()

 

 

本文参考如下:

  1. time模块官方文档
  2. datetime模块官方文档
  3. 廖雪峰的官方网站
  4. http://blog.csdn.net/you_are_my_dream/article/details/61616465
  5. http://blog.csdn.net/tigerking1017/article/details/51332220
  6. http://blog.csdn.net/cherdw/article/details/55224209
  7. https://www.cnblogs.com/cindy-cindy/p/6720196.html
  8. https://blog.csdn.net/python3_2017/article/details/78983370
  9. https://blog.csdn.net/qq_25420115/article/details/53149669
posted @ 2018-12-14 17:10  amberLIU  阅读(6881)  评论(0编辑  收藏  举报