17-[模块]-time&datetime

1.表示时间time方式

在Python中,用三种方式来表示时间,分别是时间戳、格式化时间字符串和结构化时间

1.时间戳(timestamp):也就是1970年1月1日之后的秒,
例如1506388236.216345,可以通过time.time()获得。时间戳是一个浮点数,可以进行加减运算,但请注意不要让结果超出取值范围。

2.格式化的时间字符串(string_time):也就是年月日时分秒这样的我们常见的时间字符串,
例如2017-09-26 09:12:48,可以通过time.localtime()获得;

3,结构化时间(struct_time):一个包含了年月日时分秒的多元元组,
例如time.struct_time(tm_year=2017, tm_mon=9, tm_mday=26, tm_hour=9, tm_min=14, tm_sec=50, tm_wday=1, tm_yday=269, tm_isdst=0),可以通过time.strftime('%Y-%m-%d')获得。

  

由于Python的time模块实现主要调用C库,所以各个平台可能有所不同。time模块目前只支持到2038年前。如果需要处理范围之外的日期,请使用datetime模块。

UTC(Coordinated Universal Time,世界协调时),亦即格林威治天文时间,世界标准时间。我们中国为东八区,比UTC早8个小时,也就是UTC+8。关于UTC的缩写,有个故事,你可能已经注意到了,按英文的缩写,应该是CUT,而不是UTC。但是世界协调时在法文中的缩写是TUC,两国互相不让,作为妥协,最后干脆简称UTC。

DST(Daylight Saving Time)即夏令时。

 

2.time模块的方法

  • time.localtime([secs]):将一个时间戳转换为当前时区的struct_time。secs参数未提供,则以当前时间为准。
  • time.gmtime([secs]):和localtime()方法类似,gmtime()方法是将一个时间戳转换为UTC时区(0时区)的struct_time。
  • time.time():返回当前时间的时间戳。
  • time.mktime(t):将一个struct_time转化为时间戳。
  • time.sleep(secs):线程推迟指定的时间运行。单位为秒。
  • time.asctime([t]):把一个表示时间的元组或者struct_time表示为这种形式:'Sun Oct 1 12:04:38 2017'。如果没有参数,将会将time.localtime()作为参数传入。
  • time.ctime([secs]):把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。如果参数未给或者为None的时候,将会默认time.time()为参数。它的作用相当于time.asctime(time.localtime(secs))。
  • time.strftime(format[, t]):把一个代表时间的元组或者struct_time(如由time.localtime()和time.gmtime()返回)转化为格式化的时间字符串。如果t未指定,将传入time.localtime()。

    • 举例:time.strftime("%Y-%m-%d %X", time.localtime()) #输出'2017-10-01 12:14:23'
  • time.strptime(string[, format]):把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作。

    • 举例:time.strptime('2017-10-3 17:54',"%Y-%m-%d %H:%M") #输出 time.struct_time(tm_year=2017, tm_mon=10, tm_mday=3, tm_hour=17, tm_min=54, tm_sec=0, tm_wday=1, tm_yday=276, tm_isdst=-1)

  

 

# time.time() 方法 :当前时间戳
In [22]: import time

In [23]: time.time()
Out[23]: 1518865113.717425

In [24]: time.time()/3600/24/365
Out[24]: 48.1628973505411

In [25]: time.time()/3600/24/365 + 1970
Out[25]: 2018.1628977987789

 

3.结构化时间

结构化时间元组共有9个元素,按顺序排列如下表:

索引	属性	取值范围
0	tm_year(年)	比如2017
1	tm_mon(月)	1 - 12
2	tm_mday(日)	1 - 31
3	tm_hour(时)	0 - 23
4	tm_min(分)	0 - 59
5	tm_sec(秒)	0 - 61
6	tm_wday(weekday)	0 - 6(0表示周一)
7	tm_yday(一年中的第几天)	1 - 366
8	tm_isdst(是否是夏令时)	默认为-1
既然结构化时间是一个元组,那么就可以通过索引进行取值,也可以进行分片,或者通过属性名获取对应的值。

  

# time.localtime()    该时区 当前时间的  时间戳转换为结构化时间
In [26]: time.localtime()                                                                           
Out[26]: time.struct_time(tm_year=2018, tm_mon=2, tm_mday=17, tm_hour=18, tm_min=59, tm_sec=17, tm_w
day=5, tm_yday=48, tm_isdst=0)                                                                      
                                                                                                    
In [27]: a = time.localtime()                                                                       
                                                                                                    
In [28]: a.tm_year                                                                                  
Out[28]: 2018                                                                                       
                                                                                                    
In [29]: a.tm_mon                                                                                   
Out[29]: 2                                                                                          
                                                                                                    
In [30]: "%s-%s-%s"%(a.tm_year,a.tm_mon,a.tm_mday)           # 格式化输出                                       
Out[30]: '2018-2-17'                                                                                

 

# 0时区 当前时间 结构化时间
In [31]: time.gmtime()
Out[31]: time.struct_time(tm_year=2018, tm_mon=2, tm_mday=17, tm_hour=11, tm_min=2, tm_sec=29, tm_wday=5, tm_yday=48, tm_isdst=0)

 

 

# 结构化转换为时间戳
In [33]: time.mktime(a)
Out[33]: 1518865175.0

In [34]: a
Out[34]: time.struct_time(tm_year=2018, tm_mon=2, tm_mday=17, tm_hour=18, tm_min=59, tm_sec=35, tm_wday=5, tm_yday=48, tm_isdst=0)

 

 

# 表示为这种形式:'Sun Oct 1 12:04:38 2017'
In [44]: time.asctime()             
Out[44]: 'Sat Feb 17 19:08:53 2018' 
                                                               
# 把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式                                    
In [45]: time.ctime()               
Out[45]: 'Sat Feb 17 19:09:32 2018' 
In [46]: time.ctime(123232)
Out[46]: 'Fri Jan  2 18:13:52 1970'

In [47]: time.ctime(0)
Out[47]: 'Thu Jan  1 08:00:00 1970'

In [48]: time.ctime(+100)
Out[48]: 'Thu Jan  1 08:01:40 1970'

In [49]: time.ctime(+1000000)
Out[49]: 'Mon Jan 12 21:46:40 1970'

In [50]: time.ctime(+10000000000)
Out[50]: 'Sun Nov 21 01:46:40 2286'

 

 

4.格式化时间

格式	含义
%a	本地星期名称的简写(如星期四为Thu)
%A	本地星期名称的全称(如星期四为Thursday)
%b	本地月份名称的简写(如八月份为agu)
%B	本地月份名称的全称(如八月份为august)
%c	本地相应的日期和时间的字符串表示(如:15/08/27 10:20:06)
%d	一个月中的第几天(01 - 31)
%f	微秒(范围0.999999)
%H	一天中的第几个小时(24小时制,00 - 23)
%I	第几个小时(12小时制,0 - 11)
%j	一年中的第几天(001 - 366)
%m	月份(01 - 12)
%M	分钟数(00 - 59)
%p	本地am或者pm的标识符
%S	秒(00 - 61)
%U	一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之 前的所有天数都放在第0周。
%w	一个星期中的第几天(0 - 6,0是星期天)
%W	和%U基本相同,不同的是%W以星期一为一个星期的开始。
%x	本地相应日期字符串(如15/08/01)
%X	本地相应时间字符串(如08:08:10)
%y	去掉世纪的年份(00 - 99)两个数字表示的年份
%Y	完整的年份(4个数字表示年份)
%z	与UTC时间的间隔(如果是本地时间,返回空字符串)
%Z	时区的名字(如果是本地时间,返回空字符串)
%%	‘%’字符

  

# strftime() 格式化时间
In [56]: a
Out[56]: time.struct_time(tm_year=2018, tm_mon=2, tm_mday=17, tm_hour=18, tm_min=59, tm_sec=35, tm_wday=5, tm_yday=48, tm_isdst=0)

In [55]: time.strftime('%Y-%m-%d')
Out[55]: '2018-02-17'

In [57]: time.strftime('%Y-%m-%d %H:%M:%S',a)
Out[57]: '2018-02-17 18:59:35'

In [58]: time.strftime('%Y-%m-%d %H:%M:%S %A',a)
Out[58]: '2018-02-17 18:59:35 Saturday'

In [59]: time.strftime('%Y-%m-%d %H:%M:%S %a',a)
Out[59]: '2018-02-17 18:59:35 Sat'

In [60]: time.strftime('%Y-%m-%d %H:%M:%S %p',a)
Out[60]: '2018-02-17 18:59:35 PM'

In [61]: time.strftime('%Y-%m-%d %H:%M:%S %U',a)
Out[61]: '2018-02-17 18:59:35 06'

In [64]: time.strftime('%Y-%m-%d %H:%M:%S %U')
Out[64]: '2018-02-17 19:14:29 06'

In [65]: time.strftime('%Y-%m-%d %H:%M:%S %w')
Out[65]: '2018-02-17 19:14:33 6'

In [66]: time.strftime('%Y-%m-%d %H:%M:%S %W')
Out[66]: '2018-02-17 19:14:36 07'

In [67]: time.strftime('%Y-%m-%d %H:%M:%S %z')
Out[67]: '2018-02-17 19:14:39 Öйú±ê׼ʱ¼ä'

In [68]: time.strftime('%Y-%m-%d %H:%M:%S %Z')
Out[68]: '2018-02-17 19:14:44 Öйú±ê׼ʱ¼ä'

 5.转换关系

6.datetime模块

相比于time模块,datetime模块的接口则更直观、更容易调用

datetime模块定义了下面这几个类:

datetime.date:表示日期的类。常用的属性有year, month, day;
datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond;
datetime.datetime:表示日期时间。
datetime.timedelta:表示时间间隔,即两个时间点之间的长度。
datetime.tzinfo:与时区有关的相关信息。(这里不详细充分讨论该类,感兴趣的童鞋可以参考python手册)

  

 

我们需要记住的方法仅以下几个:

1.d=datetime.datetime.now() 返回当前的datetime日期类型

d.timestamp(),d.today(), d.year,d.timetuple()等方法可以调用
  

In [5]: datetime.datetime.now()
Out[5]: datetime.datetime(2018, 2, 17, 19, 22, 27, 966803)

In [9]: d.timestamp()
Out[9]: 1518866577.650586

In [10]: d.today()
Out[10]: datetime.datetime(2018, 2, 17, 19, 23, 17, 125420)

In [11]: d.year
Out[11]: 2018

In [12]: d.timetuple()
Out[12]: time.struct_time(tm_year=2018, tm_mon=2, tm_mday=17, tm_hour=19, tm_min=22, tm_sec=57, tm_wday=5, tm_yday=48, tm_isdst=-1)

 

  

2.datetime.date.fromtimestamp(322222) 把一个时间戳转为datetime日期类型

In [13]: datetime.date.fromtimestamp(3232323)
Out[13]: datetime.date(1970, 2, 7)

 

3.时间运算

>>> datetime.datetime.now()
datetime.datetime(2017, 10, 1, 12, 53, 11, 821218)

>>> datetime.datetime.now() + datetime.timedelta(4) #当前时间 +4天
datetime.datetime(2017, 10, 5, 12, 53, 35, 276589)

>>> datetime.datetime.now() + datetime.timedelta(hours=4) #当前时间+4小时
datetime.datetime(2017, 10, 1, 16, 53, 42, 876275)
In [21]: datetime.datetime.now() + datetime.timedelta(years=4)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-21-764417f227f6> in <module>()
----> 1 datetime.datetime.now() + datetime.timedelta(years=4)

TypeError: 'years' is an invalid keyword argument for this function

 

 

  4.时间替换

>>> d.replace(year=2999,month=11,day=30)

datetime.date(2999, 11, 30)

 

posted @ 2018-02-17 19:29  venicid  阅读(262)  评论(0编辑  收藏  举报