欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Pyhton——时间模块详解

程序员文章站 2022-05-05 15:09:54
...

Pyhton——时间模块详解

Python中提供了多个用于对日期和时间进行操作的内置模块:time模块、datetime模块和calendar模块。其中time模块是通过调用C库实现的,所以有些方法在某些平台上可能无法调用,但是其提供的大部分接口与C标准库time.h基本一致。time模块相比,datetime模块提供的接口更直观、易用,功能也更加强大。

我们先看关于表示时间的几种方法
- UTC time 世界协调时,又称格林尼治时间,世界标准时。与UTC对应各个时区的localtime,北京东八区比UTC早8小时,所以用UTC+8表示
- epoch time 表示时间开始的起点;它是一个特定的时间,不同平台上这个时间点的值不太相同,对于Unix而言,epoch time为 1970-01-01 00:00:00 UTC
- timestamp(时间戳) 也称为Unix时间 或 POSIX时间;它是一种时间表示方式,表示从格林尼治时间1970年1月1日0时0分0秒开始到现在所经过的毫秒数,其值为float类型。 但是有些编程语言的相关方法返回的是秒数(Python就是这样),这个需要看方法的文档说明。需要说明的是时间戳是个差值,其值与时区无关。
- 元组(struct_time) struct_time元组共有9个元素,返回struct_time的函数主要有gmtime(),localtime(),strptime()。

time模块

下面我们通过几个常用的实例详细介绍struct_time 中的属性

import time
#  time.localtime()  :将一个时间戳转换为当前时区的struct_time

time.localtime()

#可以看到里面有9个元素

# tm_wday=2    代表周二
# tm_yday=73   代表一年中的第73天
# tm_isdst=0     代表是否是夏令时,可取0,1,-1    取不同值可能会影响性能
time.struct_time(tm_year=2018, tm_mon=3, tm_mday=14, tm_hour=0, tm_min=24, tm_sec=59, tm_wday=2, tm_yday=73, tm_isdst=0)
t = time.time()     #返回当前时间的时间戳
print(t)

print('-------')

time.sleep(1)    #线程推迟指定的时间运行,单位为秒。

print('hello,一秒后输出')
1520959413.8214176
-------
hello,一秒后输出
t = time.gmtime()#将一个时间戳转换为UTC时区(0时区)的struct_time。
print(t)

print('------------')

t1 = time.mktime(time.localtime())   #将一个struct_time 转化为时间戳
print(t1)
time.struct_time(tm_year=2018, tm_mon=3, tm_mday=13, tm_hour=16, tm_min=43, tm_sec=19, tm_wday=1, tm_yday=72, tm_isdst=0)
------------
1520959399.0
t = time.asctime()
print(t)
#  把一个表示时间的元组或者struct_time表示为这种形式:
#  'Sun Jun 20 23:21:05 1993'。如果没有参数,将会将time.localtime()作为参数传入。

print('----------')

t1 = time.ctime()
print(t1)
#把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。
#如果参数未给或者为None的时候,将会默认time.time()为参数。它的作用相当于time.asctime(time.localtime(secs))。
Wed Mar 14 00:44:22 2018
----------
Wed Mar 14 00:44:22 2018
print(time.strftime('%Y-%m-%d',time.localtime()))

'''
返回字符串表示的当地时间。 
把一个代表时间的元组或者struct_time(如由time.localtime()和time.gmtime()返回)转化为格式化的时间字符串,
格式由参数format决定。如果未指定,将传入time.localtime()。如果元组中任何一个元素越界,就会抛出ValueError的异常。
函数返回的是一个可读表示的本地时间的字符串。 
参数:
format:格式化字符串
t :可选的参数是一个struct_time对象
'''

2018-03-14
格式化字符 字符含义
%a 本地(locale)简化星期名称
%A 本地完整星期名称
%b 本地简化月份名称
%B 本地完整月份名称
%c 本地相应的日期和时间表示
%d 一个月中的第几天(01 - 31)
%H 一天中的第几个小时(24小时制,00 - 23)
%I 第几个小时(12小时制,01 - 12)
%j 一年中的第几天(001 - 366)
%m 月份(01 - 12)
%M 分钟数(00 - 59)
%p 本地am或者pm的相应符(“%p”只有与“%I”配合使用才有效果)
%S 秒(01 - 61)(文档中强调确实是0 - 61,而不是59,闰年秒占两秒)
%U 一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。
%w 一个星期中的第几天(0 - 6,0是星期天)
%W 和%U基本相同,不同的是%W以星期一为一个星期的开始。
%x 本地相应日期
%X 本地相应时间
%y 去掉世纪的年份(00 - 99)
%Y 完整的年份
%Z 时区的名字(如果不存在为空字符)
%% ‘%’字符

当使用strptime()函数时,只有当在这年中的周数和天数被确定的时候%U和%W才会被计算

综上,time模块总共有三种时间表达方式:
- timestamp 时间戳
- tuple 或者 struct_time
- 格式化字符串

更多相关请查阅 time模块官方文档

datetime模块

datetime是基于time模块封装的,是date和time模块的合集,但是执行效率略低。datetime有两个常量,MAXYEAR和MINYEAR,分别是9999和1。
datetime里有四个重要的类:
- date :表示日期,年月日
- datetime :表示日期时间,年月日时分秒
- time :表示时间,时分秒
- timedelta :表示时间间隔

datetime的date类

# datetime.date(year,month,day):   返回 year-month-day


# import datetime  
from datetime import date

today = datetime.date.today()      # datetime.date.today 返回今日
print(today,type(today))
# 输出格式为  date 类

print(str(today),type(str(today)))

t = datetime.date(2016,1,22)
print(t)
# (年,月,日) → 直接得到当时日期
2018-03-14 <class 'datetime.date'>
2018-03-14 <class 'str'>
2016-01-22

datetime的time类

time类由hour小时、minute分钟、second秒、microsecond毫秒和tzinfo五部分组成

# datetime.time

t1 =datetime.time(2,22,33,9)
print(t1,type(t1))

t2 = t1.strftime('%H:%M:%S')
print(t2,type(t2))     
# 把一个datetime.time 类 转化为 str
02:22:33.000009 <class 'datetime.time'>
02:22:33 <class 'str'>

datetime的datetime类

datetime类其实是可以看做是date类和time类的合体,其大部分的方法和属性都继承于这二个类

#  datetime.datetime:   datetime对象

now = datetime.datetime.now()
print(now,type(now))
#输出datetime类

t1 = datetime.datetime(2016,6,1)
t2 = datetime.datetime(2014,1,1,12,44,33)
print(t1)
print(t2)
# (年,月,日,时,分,秒),至少输入年月日

t2 - t1
# 相减得到时间差 —— timedelta
2018-03-14 22:53:11.224884 <class 'datetime.datetime'>
2016-06-01 00:00:00
2014-01-01 12:44:33





datetime.timedelta(-882, 45873)

时间差 timedelta

# datetime.timedelta   时间差

today = datetime.datetime.today()
yestoday = today + datetime.timedelta(-1)   #  -1  代表前一天
print(today)
print(yestoday)
print(today - datetime.timedelta(7))
# 时间差主要用作时间的加减法,相当于可被识别的时间“差值”
2018-03-13 21:35:31.238277
2018-03-12 21:35:31.238277
2018-03-06 21:35:31.238277

日期字符转换 parser.parse

#  parser.parse:日期字符转换

from dateutil.parser import parse

date = '12-23-2018'
date1 = '13/3/2018'
print(parse(date),type(parse(date)))
print(parse(date1))
# 直接将几乎任何类似时间格式的str转化成datetime.datetime

print(parse('2000-1-1'),'\n',
     parse('5/1/2014'),'\n',
     parse('5/1/2014', dayfirst = True),'\n',  # 国际通用格式中,日在月之前,可以通过dayfirst来设置
     parse('22/1/2014'),'\n',
     parse('Jan 31, 1997 10:45 PM'))
# 各种格式可以解析,但无法支持中文
2018-12-23 00:00:00 <class 'datetime.datetime'>
2018-03-13 00:00:00
2000-01-01 00:00:00 
 2014-05-01 00:00:00 
 2014-01-05 00:00:00 
 2014-01-22 00:00:00 
 1997-01-31 22:45:00