python笔记-python关于时间的计算
一、时间的几种格式:
1、时间戳(timestamp)
从1970年1月1日0点开始,到现在的秒数(以格林尼治时间为准)。
数据类型为'float',浮点数,小数
print(time.time()) # 返回的单位是秒不是毫秒 print(type(time.time()))
2、时间元组(Time tuple(time obj))
这是把年月日时分秒周日……作为一个元组
数据类型为‘time.struct_time’,元组
print(time.localtime()) print(type(time.localtime())) print('年:', time.localtime()[0]) print('月:', time.localtime()[1]) print('日:', time.localtime()[2]) print('时:', time.localtime()[3]) print('分:', time.localtime()[4]) print('秒:', time.localtime()[5]) print('周几:', time.localtime()[6]) # 0到6,0代表周一 print('第几天:', time.localtime()[7]) print('夏令营:', time.localtime()[8]) print('-----------------------------') print('年:', time.localtime().tm_year) print('月:', time.localtime().tm_mon) print('日:', time.localtime().tm_mday) print('时:', time.localtime().tm_hour) print('分:', time.localtime().tm_min) print('秒:', time.localtime().tm_sec) print('周几:', time.localtime().tm_wday) print('第几天:', time.localtime().tm_yday) print('夏令营:', time.localtime().tm_isdst)
3、时间格式(Datetime obj)
最准确的时间格式,还带毫秒
类型为'datetime.datetime'
print(datetime.datetime.now()) print(type(datetime.datetime.now()))
4、时间字符串(string),就是字符串而已
time.strftime(fmt, [tupletime]):接收以时间元组,并返回以可读字符串表示的时间,格式由fmt决定。
数据类型为‘str’,字符串
print(time.strftime('%Y%m%d%H%M%S'))
% y 两位数的年份表示(00 - 99)
% Y 四位数的年份表示(000 - 9999)
% m 月份(01 - 12)
% d 月内中的一天(0 - 31)
% H 24小时制小时数(0 - 23)
% I 12小时制小时数(01 - 12)
% M 分钟数(00 = 59)
% S 秒(00 - 59)
% a 本地简化星期名称
% A 本地完整星期名称
% b 本地简化的月份名称
% B 本地完整的月份名称
% c 本地相应的日期表示和时间表示
% j 年内的一天(001 - 366)
% p 本地A.M.或P.M.的等价符
% U 一年中的星期数(00 - 53)星期天为星期的开始
% w 星期(0 - 6),星期天为星期的开始
% W 一年中的星期数(00 - 53)星期一为星期的开始
% x 本地相应的日期表示
% X 本地相应的时间表示
% Z 当前时区的名称
% % % 号本身
5、总结
# 时间字符串,就是一个字符串,不方便进行计算,首先弃用。
# 时间戳,是个浮点数,也不方便进行计算,也弃用。
# 时间元组,是个元组,不能直接存入数据库,还是弃用。
# 时间格式,这是最基本的格式,优先选用。
# time模块,是以时间戳为基础的。
# datetime模块,是以时间格式为基础的。
二、time模块
time模块中时间表现的形式主要有三种:
- timestamp:时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量
- struct_time:时间元组,共有九个元素
- format_time:格式化时间,已格式化的结构使时间更具可读性,包括自动化格式和固定格式
1、时间格式转换图:
2、生成时间戳timestamp
import time print(time.time())
3、生成时间元组struct_time
import time print(time.localtime())
4、时间戳转换为时间元组
# 本地时间
import time print(time.localtime(time.time())) print(time.localtime(1556348505))
# 格林威治时间
import time print(time.gmtime(time.time())) print(time.gmtime(1556348505))
5、时间元组转换为时间戳
import time print(time.mktime(time.localtime())) print(time.mktime(time.localtime(1556348505))) print(time.mktime((2018,5,27,1,5,27,6,147,-1))) # 人造时间元组转换为时间戳
6、生成格式化时间
import time print(time.strftime("%Y-%m-%d %H:%M:%S")) print(time.strftime("%Y-%m-%d %X")) # %X:本地相应的时间表示
7、时间元组转换为格式化时间
import time timStamp = 1556348505 # 需要转换的时间戳 struct_time = time.localtime(timStamp) # 时间戳转换为时间元组 print(time.strftime("%Y-%m-%d %H:%M:%S", struct_time)) # 时间元组转换为格式化时间 print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) # 本地时间的时间元组转换为格式化时间
8、格式化时间转换为时间元组
import time print(time.strptime("2022-04-07 11:12:04", "%Y-%m-%d %H:%M:%S"))
9、生成固定格式的时间表示形式
time.asctime():接受时间元组并返回一个可读的形式为"Tue Dec 11 18:07:14 2008"(2008年12月11日 周二18时07分14秒)的24个字符的字符串。
语法:time.asctime([t]))
参数:t为9个元素的元组或者通过函数 gmtime() 或 localtime() 返回的时间值。
time.ctime():把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。 如果参数未给或者为None的时候,将会默认time.time()为参数。它的作用相当于 asctime(localtime(secs))。
语法:time.ctime([ sec ])
参数:sec为要转换为字符串时间的秒数。
import time print(time.asctime()) print(time.ctime()) print(time.asctime(time.localtime())) # 本地时间 print(time.asctime(time.gmtime())) # 格林威治时间 timeStamp = 1556348505 struct_time = time.localtime(timeStamp) print(time.asctime(struct_time)) print(time.ctime(timeStamp))
三、datetime模块
datetime模块定义了六个类,分别为:
- datetime.date:表示日期的类,常用的属性是year、month、day
- datetime.time:表示时间的类,常用的属性是hour、minute、second、microsecond
- datetime.datetime:表示日期时间的类
- datetime.timedelta:表示两个date、time、datetime实例之间的时间间隔
- datetime.tzinfo:时区相关信息对象的抽象基类,他们由datetime和time类使用,以提供自定义时间而调整
- datetime.timezone:python3.2新增的功能,实现tzinfo抽象基类的类,表示与UTC的固定偏移量
1、date类
date类有三个参数,datetime.date(year,month,day),返回year-month-day
① 静态方法和字段
from datetime import date print(date.max) # date对象所能表示的最大日期 print(date.min) # date对象所能表示的最小日期 print(date.resolution) # date对象所表示日期的最小单位,这里是天 print(date.today()) # 返回一个表示当前本地日期的date对象 print(date.fromtimestamp(1556348505)) # 根据给定的时间戳,返回一个date对象
② 方法和属性
from datetime import date # d1 = date.today() # 返回一个表示当前本地日期的date对象 d1 = date(2022,4,7) # date对象 print(d1.year) # 年 print(d1.month) # 月 print(d1.day) # 日 print(d1.replace(2021, 1, 12)) # 生成一个新的日期对象,用参数指定的年,月,日代替原有对象中的属性。(原有对象仍保持不变) print(d1.timetuple()) # 返回日期对应的struct_time print(d1.weekday()) # 返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此类推 print(d1.isoweekday()) # 返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推 print(d1.isocalendar()) # 返回格式如(年,第几周,周的第几天)的元组 print(d1.isoformat()) # 返回格式如'YYYY-MM-DD’的字符串 print(d1.strftime("%Y-%m-%d %H:%M:%S"))
2、time类
类的定义:class datetime.time(hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ) 。hour为必须参数,其他为可选参数
① 静态方法和字段
from datetime import time print(time.max) # time类能表示的最大时间 print(time.min) # time类能表示的最小时间 print(time.resolution) # 时间的最小单位,这里是1微妙
② 方法和属性
from datetime import time d1 = time(16,33,7,24) # time对象 print(d1.hour) # 时 print(d1.minute) # 分 print(d1.second) # 秒 print(d1.microsecond) # 微秒 print(d1.tzinfo) # 返回传递给time构造方法的tzinfo对象,如果该参数未给出,则返回None print(d1.replace(10)) # 创建一个新的时间对象,用参数指定的时、分、秒、微秒代替原有对象中的属性(原有对象仍保持不变) print(d1.isoformat()) # 返回型如"HH:MM:SS"格式的字符串表示 print(d1.strftime("%Y-%m-%d %H:%M:%S"))
3、datetime类
datetime类的定义:class datetime.datetime (year, month, day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] ),year, month 和 day是必须要传递的参数
① 静态方法和字段
from datetime import datetime from datetime import date from datetime import time
print(datetime.datetime(2022, 4, 7, 18, 30, 30)) # datetime对象 print(datetime.today()) # 返回一个表示当前本地时间的datetime对象 print(datetime.now()) # 返回一个表示当前本地时间的datetime对象,如果提供了参数tz(datetime.now([tz]),则获取tz参数所指时区的本地时间 print(datetime.utcnow()) # 返回一个当前utc时间的datetime对象(格林威治时间) print(datetime.fromtimestamp(1556348505)) # 根据时间戮创建一个datetime对象,参数tz指定时区信息;(datetime.fromtimestamp(timestamp[, tz])) print(datetime.utcfromtimestamp(1556348505)) # 根据时间戳创建一个datetime对象(格林威治时间) print(datetime.combine(date.today(), time(18, 10, 6))) # 根据date和time,创建一个datetime对象 print(datetime.strptime("2022-04-07 18:11:33", "%Y-%m-%d %H:%M:%S")) # 将格式字符串转换为datetime对象
②方法和属性
from datetime import datetime dt = datetime.now() # datetime对象 print(dt.timestamp()) # 获取时间戳,等同于time模块的time.time() print(dt.year) # 年 print(dt.hour) # 时 print(dt.date()) # 获取date对象 print(dt.time()) # 获取time对象 print(dt.replace(2002, 2)) # 生成并返回一个新的datetime对象,如果所有参数都没有指定,则返回一个与原datetime对象相同的对象 print(dt.timetuple()) # 返回datetime对象对应的tuple(不包括tzinfo) print(dt.weekday()) # 返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此类推 print(dt.isoweekday()) # 返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推 print(dt.isocalendar()) # 返回格式如(年,第几周,周的第几天)的元组 print(dt.isoformat()) print(dt.ctime()) # 等价于time模块的time.ctime(sec) print(dt.strftime("%Y-%m-%d %H:%M:%S"))
4、timedelta类,时间加减
timedelta对象表示两个不同时间之间的差值。如果使用time模块对时间进行算术运行,只能将字符串格式的时间 和 struct_time格式的时间对象 先转换为时间戳格式,然后对该时间戳加上或减去n秒,最后再转换回struct_time格式或字符串格式,这显然很不方便。而datetime模块提供的timedelta类可以让我们很方面的对datetime.date, datetime.time和datetime.datetime对象做算术运算,且两个时间之间的差值单位也更加容易控制。使用timedelta可以很方便的在日期上做天days,小时hour,分钟,秒,毫秒,微妙的时间计算,如果要计算月份则需要另外的办法。
类定义:class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, hours=0, weeks=0)
datetime.timedelta():返回一个时间间隔对象,可以直接与datetime.datetime对象做加减操
datetime.timedelta().total_seconds():时间差中包含的总秒数
import datetime print(datetime.timedelta(days=365).total_seconds()) # 一年包含的总秒数 print(datetime.datetime.now() + datetime.timedelta(3)) # 三天后 print(datetime.datetime.now() + datetime.timedelta(-3)) # 三天前 print(datetime.datetime.now() + datetime.timedelta(hours=3)) # 三小时后 print(datetime.datetime.now() + datetime.timedelta(hours=3, seconds=30)) # 三小时三十秒后 print(datetime.date(2022, 3, 15) + datetime.timedelta(10)) # 2022年3月15日后十天 print(datetime.datetime(2022, 4, 7, 18, 30, 30) + datetime.timedelta(days=10, hours=1)) # 2022年4月7日 18:30:30秒后十天一个小时 print(datetime.datetime.now().date() + datetime.timedelta(days=1)) # 一天后
print(datetime.datetime.now() + datetime.timedelta(weeks=1)) # 当前日期为2022年4月8日,weeks为1则表示一周即7天
5、datetime常用操作
①datetime转字符串 -------strftime()函数
两种写法:datetime.datetime.strftime(datatime对象,格式化的字符串) 或 datatime对象.strftime(格式化的字符串)
备注:若格式化的字符串中含中文,需使用format方式表示
import datetime print(datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d %H:%M:%S")) print(datetime.datetime.strftime(datetime.datetime.now(), "%Y{}%m{}%d{} %H{}%M{}%S{}").format('年', '月', '日', '时', '分', '秒')) print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) print(datetime.datetime.now().strftime("%Y{}%m{}%d{} %H{}%M{}%S{}").format('年', '月', '日', '时', '分', '秒'))
②字符串转datetime ------strptime()函数
写法:datetime.datetime.strptime(时间字符串,格式化的字符串)
import datetime time1 = datetime.datetime.strptime('2022-04-07 21:02:47', "%Y-%m-%d %H:%M:%S") print(time1, type(time1)) time2 = datetime.datetime.strptime("2024年11月02日 13时50分03秒", "%Y年%m月%d日 %H时%M分%S秒") print(time2,type(time2))
③时间差操作 ------timedelta()
可加入的参数:
weeks=0 周数,数字1表示七天;
days=0 天数;
hours=0 小时数;
minutes=0 分钟数;
seconds=0 秒数;
milliseconds=0 毫秒数,千分之一秒;
microseconds=0 微秒数;百万分之一秒.
具体见上方timedelta
④时间戳操作
import datetime timeStamp = datetime.datetime.now().timestamp() # 获取datetime对象的时间戳 print(timeStamp) print(datetime.datetime.fromtimestamp(timeStamp)) # 由时间戳初始化datetime对象
四、计算过去时间和未来时间代码
import datetime import time def get_date_time(days=0, hours=0, minutes=0, seconds=0, micro_seconds=0, date_format='%Y-%m-%d %H:%M:%S'): '获取时间,之前的时间(day=-90代表往前推90天)或未来的时间(day=90代表往后推90天)' now_time = datetime.datetime.now() need_time = now_time + datetime.timedelta(days=days, hours=hours, minutes=minutes, seconds=seconds, microseconds=micro_seconds) need_time = need_time.strftime(date_format) print(need_time) return need_time def get_last_time(second): '获取过去的时间,second是当前时间比过去相差的秒数' last = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time() - second)) # 当前时间之前推多少秒 return last
——————————————————————
参考文章:https://www.cnblogs.com/haitaoli/p/10823403.html
https://blog.csdn.net/gty931008/article/details/80254806