python-时间日期-time,datetime
time-datatime
概要
Python中表示时间的两种方式
- 时间戳 :相对于1970.1.1 00:00:00 以秒计算的偏移量,唯一的
- 时间元组
struct_time
:共有9个元素
- tm_year:年1-12
- tm_mon:月1-12
- tm_mday:日1-31
- tm_hour:时0-23
- tm_min:分0-59
- tm_sec:秒0-59
- tm_wday:星期0-6(0表示周日)
- tm_day:一年中的第几天1-366
- tm_isdst:是否是夏令,默认为-1
time
模块
time
是归类在常规操作系统服务中,它提供的功能更加接近于操作系统层面。其所能表述的日期范围被限定在1970-2038之间,如果需要表述范围之外的日期,可能需要考虑使用datetime
模块更好。
-
time()
返回时间戳格式的时间 -
ctime()
返回字符串形式的时间,可以传入时间戳格式时间,用来做转化 -
asctime()
返回字符串形式的时间,可以传入struct_time形式时间,用来做转化 -
localtime()
返回当前时间的struct_time形式,可传入时间戳格式时间,用来做转化 -
gmtime()
返回当前时间的struct_time形式,UTC时区(0时区) ,可传入时间戳格式时间,用来做转化 -
struct_time
共有9个元素,其中前面6个为年月日时分秒,后面三个分别代表的含义为: -
tm_wday 一周的第几天(周日是0)
-
tm_yday 一年的第几天
-
tm_isdst 是否是夏令时
常用方法:
time.sleep([sec])
推迟指定时间后继续运行,单位: 秒 s
time.time()
获取时间戳。返回的是一个float
类型的数值。
time.localtime([sec])
将一个时间戳转化成一个当时时区的struct_time
,如果sec参数未输入,则以当前时间为转化标准
time.gmtime([secs])
将一个时间戳转换为UTC时区 的 struct_time
(时区时间格式)
time.mktime(t)
相对的 将一个struct_time
转换为时间戳
time.asctime([t])
把一个表示时间的元组或者struct_time
表示为 ‘Sun Aug 23 14:31:59 2015’ 这种形式
time.strftime(format[,t])
将指定的struct_time(默认为当前时间),根据指定的格式化字符串输出
- format:格式化字符串
- t :可选的参数是一个struct_time对象
时间字符串支持的格式符号:(区分大小写)
%c 本地相应的日期和时间的字符串表示(如:15/08/27 10:20:06)
%x 本地相应日期字符串(如15/08/01)
%X 本地相应时间字符串(如08:08:10)
%y 去掉世纪的年份(00 - 99)两个数字表示的年份
%Y 完整的年份(4个数字表示年份)
%m 月份(01 - 12)
%d 一个月中的第几天(01 - 31)
%H 一天中的第几个小时(24小时制,00 - 23)
%I 第几个小时(12小时制,0 - 11)
%M 分钟数(00 - 59)
%S 秒(00 - 61)
%f 微妙(范围0.999999)
%j 一年中的第几天(001 - 366)
%w 一个星期中的第几天(0 - 6,0是星期天)
%p 本地am或者pm的相应符
%U 一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之 前的所有天数都放在第0周。
%W 和%U基本相同,不同的是%W以星期一为一个星期的开始。
%z 与UTC时间的间隔(如果是本地时间,返回空字符串)
%Z 时区的名字(如果是本地时间,返回空字符串)
%% ‘%’字符
%a 本地星期名称的简写(如星期四为Thu)
%A 本地星期名称的全称(如星期四为Thursday)
%b 本地月份名称的简写(如八月份为agu)
%B 本地月份名称的全称(如八月份为august)
函数 | 描述 | 输入、输出 | |
---|---|---|---|
time.sleep(secs) |
推迟指定的时间运行 | 输入单位 秒 | |
time.time() |
返回当前时间的时间戳 | 输出float |
|
time.localtime([secs]) |
返回当前时区的struct_time 元组 |
secs 可选,单位秒 |
|
time.gmtime([secs]) |
将一个时间戳转换为UTC时区 的 struct_time (时区时间格式) | ||
time.mktime(t) |
相对的 将一个struct_time 转换为时间戳 |
||
time.asctime([t]) |
把一个表示时间的元组struct_time 表示为 ‘Sun Aug 23 14:31:59 2015’ |
||
time.ctime([secs]) |
把一个时间戳(按秒计算的浮点数)转化为time.asctime() 的形式 |
||
time.strftime(format[,t]) |
根据指定的格式化字符串输出 | 输入struct_time |
|
time.strptime() |
解析表示时间的字符串并返回struct_time |
案例1
import time
print(time.time()) # 返回时间戳
# 1626832245.6659722
#--------------------------------------------------------------------
print(time.time())
print(time.localtime()) # 返回 struct_time
#1626832423.3920887
print(time.localtime(1626832399.169254)) # 将一个时间戳转换为当前时区的struct_time
#time.struct_time(tm_year=2021, tm_mon=7, tm_mday=21, tm_hour=9, tm_min=53, tm_sec=43, tm_wday=2, tm_yday=202, tm_isdst=0)
#time.struct_time(tm_year=2021, tm_mon=7, tm_mday=21, tm_hour=9, tm_min=53, tm_sec=19, tm_wday=2, tm_yday=202, tm_isdst=0)
#--------------------------------------------------------------------
# 线程睡眠指定时间,单位为秒
time.sleep(10)
案例2
print(time.asctime(time.gmtime()))
# Tue Sep 21 11:17:50 2021
print(time.ctime(1440338541.0))
print(time.ctime())
# Sun Aug 23 22:02:21 2015
# Tue Sep 21 19:19:04 2021
案例3
localtime=time.localtime()
print(dir(localtime))
# [...,'tm_hour', 'tm_isdst', 'tm_mday', 'tm_min', 'tm_mon', 'tm_sec', 'tm_wday', 'tm_yday', 'tm_year', 'tm_zone']
print(localtime)
# time.struct_time(tm_year=2021, tm_mon=9, tm_mday=21, tm_hour=19, tm_min=21, tm_sec=58, tm_wday=1, tm_yday=264, tm_isdst=0)
print(localtime.tm_year)
# 2021
strtime=time.strftime("%Y-%m-%d %H:%M:%S", localtime)
print(strtime)
# 2021-09-21 19:21:58
# 直接使用字符串拼接成格式时间字符串
print(str(localtime.tm_year) + "年" + str(localtime.tm_mon) + "月" + str(localtime.tm_mday) + "日")
# 2021年9月21日
print(time.strftime("%Y/%m/%d %H:%M:%S", time.localtime()))
# 2021/09/21 20:12:46
案例4
import time
time_string = "21 June, 2018"
result = time.strptime(time_string, "%d %B, %Y")
print(result)
# time.struct_time(tm_year=2018, tm_mon=6, tm_mday=21, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=172, tm_isdst=-1)
datetime模块
参考文献:https://blog.csdn.net/gty931008/article/details/80254806
datetime比time高级了不少,可以理解为datetime基于time进行了封装,提供了更多实用的函数
datetime模块定义了以下几个类:
函数 | 描述 | |
---|---|---|
datetime.date |
表示日期,常用的属性有:year, month和day | |
datetime.time |
表示时间,常用属性,hour,minute,second, | |
datetime.datetime |
表示日期时间 | |
datetime.timedelta |
表示时间间隔 | |
datetime.tzinfo |
表示时区 | |
datetime.timezone |
date类
date类定义了一些常用的类方法与类属性,date对象由year
年份、month
月份及day
日期三部分构成
-
max、min
:date对象所能表示的最大、最小日期 -
resolution
:date对象表示日期的最小单位。这里是天 -
today()
:返回一个表示当前本地日期的date对象 -
fromtimestamp(timestamp)
:根据给定的时间戮,返回一个date对象
date.today()
提供的实例方法和属性
-
year
:返回年 -
month
:返回月 -
day
:返回日 -
replace(year, month, day)
:返回新的日期对象,参数指定的年,月,日代替原有对象中的属性,原有对象仍保持不变 -
weekday()
:返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此类推 -
isoweekday()
:返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推 -
isocalendar()
:返回格式如(year, wk num, wk day) -
isoformat()
:返回格式如’YYYY-MM-DD’的字符串 -
strftime(fmt)
:自定义格式化字符串。与time模块中的strftime类似
import datetime
date1=datetime.date(2017,3,22)
print(date1.year)
print(date1.month)
print(date1.day)
today1=datetime.date.today()
print(today1.year)
# 2017
# 3
# 22
# 2021
# 两个时间点的差距
print(today1-date1)
# 1653 days, 0:00:00
# 返回标准时间 返回符合ISO 8601标准 YYYY-MM-DD
print(date1.isoformat())
# 2017-03-22
格式输出
print(date1.__format__('%Y-%m-%d'))
print(date1.__format__('%Y/%m/%d'))
print(date1.__format__('%y/%m/%d'))
# 2017-03-22
# 2017/03/22
# 17/03/22
等价的方法为strftime(...)
print(data1.strftime("%Y-%m-%d"))
# # 2017-03-22
time类
class datetime.time(hour, [minute[, second, [microsecond[, tzinfo]]]])
time
类由hour
小时、minute
分钟、second
秒、microsecond
毫秒和tzinfo
五部分组成
参数名称 | 取值范围 | |
---|---|---|
hour | [0, 23] | |
minute | [0, 59] | |
second | [0, 59] | |
microsecond | [0, 1000000] | |
tzinfo | tzinfo的子类对象,如timezone类的实例 |
方法
属性和方法 | 描述 | |
---|---|---|
t.hour | 时 | |
t.minute | 分 | |
t.second | 秒 | |
t.tzinfo | 返回传递给time构造方法的tzinfo对象 | |
t.replace(hour[, minute[, second[, microsecond[, tzinfo]]]]) | 生成并返回一个新的时间对象,原时间对象不变 | |
t.isoformat() | 返回一个‘HH:MM:SS.%f'格式的时间字符串 | |
t.strftime() | 返回指定格式的时间字符串,与time模块的strftime(format, struct_time)功能相同 | |
t.__ format __('%H:%M:%S') |
>>> a = datetime.time(12,20,59,899) # 初始化
>>> a
datetime.time(12, 20, 59, 899)
>>> a.hour
12
>>> a.minute
20
>>> a.second
59
>>> a.microsecond
899
>>> a.tzinfo
字符串输出方式
>>> a = datetime.time(12,20,59,899)
>>> a.__format__('%H:%M:%S')
'12:20:59'
或者使用 strftime
>>> a = datetime.time(12,20,59,899)
>>> a.strftime('%H:%M:%S')
'12:20:59'
datetime类
class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
参数名称 | 取值范围 | |
---|---|---|
year | [MINYEAR, MAXYEAR] | |
month | [1, 12] | |
day | [1, 指定年份的月份中的天数] | |
hour | [0, 23] | |
minute | [0, 59] | |
second | [0, 59] | |
microsecond | [0, 1000000] | |
tzinfo | tzinfo的子类对象,如timezone类的实例 |
属性和方法
对象方法/属性名称 | 描述 | |
---|---|---|
dt.year, dt.month, dt.day | 年、月、日 | |
dt.hour, dt.minute, dt.second | 时、分、秒 | |
dt.microsecond, dt.tzinfo | 微秒、时区信息 | |
dt.date() | 获取datetime对象对应的date对象 | |
dt.time() | 获取datetime对象对应的time对象, tzinfo 为None | |
dt.timetz() | 获取datetime对象对应的time对象,tzinfo与datetime对象的tzinfo相同 | |
dt.timetuple() | 返回datetime对象对应的tuple(不包括tzinfo) | |
dt.utctimetuple() | 返回datetime对象对应的utc时间的tuple(不包括tzinfo) | |
dt.isoformat([sep]) | 返回一个‘%Y-%m-%d | |
dt.strftime(format) | 返回指定格式的时间字符串 | |
from datetime import datetime,timezone
date=datetime.today()
date1=datetime(2017, 2, 4, 20, 44, 40, 556318)
date2=datetime(2017, 2, 4, 20, 44, 56, 572615)
date3=datetime.now(timezone.utc)
print(date3)
print(date.utcnow())
# 2021-10-15 09:24:36.352276+00:00
# 2021-10-15 09:24:36.353277
res=datetime.fromtimestamp(time.time())
print(res)
date1=datetime(2017, 2, 4, 20, 46, 41, 97578)
print(date1)
date2=datetime.utcfromtimestamp(time.time())
print(date2)
date4=datetime(2017, 2, 4, 20, 5, 40, 8888)
res=date4.strptime('2017/02/04 20:49', '%Y/%m/%d %H:%M')
print(res)
#2021-10-15 17:33:22.824000
#2017-02-04 20:46:41.097578
#2021-10-15 09:33:22.824000
#2017-02-04 20:49:00
print(res.day)
print(res.second)
print(res.hour)
#4
#0
#20
print(res.timestamp())
print(res.date())
print(res.replace(2021))
#1486212540.0
#2017-02-04
#2021-02-04 20:49:00
print(res.isoformat())
print(res.isoformat(sep='/'))
print(res.isoformat(sep=' '))
print(res.strftime('%Y%m%d %H:%M'))
#2017-02-04T20:49:00
2017-02-04/20:49:00
2017-02-04 20:49:00
20170204 20:49
计算时间差
import time
from datetime import datetime
a=datetime.now()
time.sleep(1)
b=datetime.now()
print(a)
print(b)
print(str(a))
# 'Z2015-04-07 04:30:03.628556'
print(datetime.strptime(str(a),"%Y-%m-%d %H:%M:%S.%f"))
c=b-a
print(c)
print(c.seconds)
# 2021-10-15 17:10:20.121184
# 2021-10-15 17:10:21.121714
# 2021-10-15 17:10:20.121184
# 2021-10-15 17:10:20.121184
# 0:00:01.000530
# 1
import time
import datetime
d1 = datetime.datetime(2005, 2, 16)
d2 = datetime.datetime(2004, 12, 31)
print(d2-d1).days
# 47