17-[模块]-time&datetime

时间:2023-03-09 15:21:35
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)

  17-[模块]-time&datetime

# 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.转换关系

17-[模块]-time&datetime

6.datetime模块

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

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

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

  17-[模块]-time&datetime

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

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

17-[模块]-time&datetime

  4.时间替换

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

datetime.date(2999, 11, 30)