【Python】关于时间的处理 datetime + time + calendar

背景

关于时间的处理,python处理时间要多注意时间格式的类型。

准备工作

关于时间处理,python最常用的是datetime, time , calendar 3个包,其中datetime中又有5个类。
整体来说,datetime包熟练基本满足大部分时间处理场景了。

datetime中5个类: 
- date类:      表示日期的类
- time类:      表示时间的类
- datetime类:  表示时间日期的类
- timedelta类: 表示两个datetime对象的差值;
- tzinfo类:    表示时区的相关信息

代码实例

一、import datetime :

datetime包主要提供表示和处理日期和时间的类, 主要用于创建和输出日期与信息的各种不同方式、时间增量的比较和计算.
datetime库定义了2个常量和5个类, 2个常量分别是MINYEAR=1和MAXYEAR=9999,5个类如上说明。
日常使用,基本熟练datetime包能满足90%以上需求;

1. date类: date类有三个对象:year、month、day, 返回格式为year-month-day.
1.1 基础操作
from datetime import date 
today():                      # 使用今天的日期构造对象 
date.today()                  # 获取当前日期 
datetime.date.today()         # 获取当前日期 
datetime.date.today().year    # 获取当前年
datetime.date.today().month   # 获取当前月
datetime.date.today().day     # 获取当前日 

# 或者用__getattribute__(...)方法获得上述值:
datetime.date.today().__getattribute__('year')
datetime.date.today().__getattribute__('month')
datetime.date.today().__getattribute__('day')

1.2 时间戳、结构 构造对象
fromtimestamp():  # 使用时间戳构造对象 
date.fromtimestamp(123456789) 

fromordinal():    # 使用日期序数构造对象 
datetime.date.fromordinal()                # 整数序数,代表从公元1年1月1日开始的序数,序数每增加1代表增加1天,返回最终计算出的日期
datetime.date.toordinal(date(1992,1,21))   # 参数是日期对象,fromtimestamp的逆过程,返回值为fromtimestamp(n)中的日期序数n 
1.3 日期比较、计算 返回 T/F
a = datetime.date(2022,1,1)
b = datetime.date(2022,1,21)
print(a.__eq__(b))   #  等于    a == b   
print(a.__ge__(b))   #  大于等于 a>=b
print(a.__gt__(b))   #  大于    a>b
print(a.__le__(b))   #  小于等于 a<=b
print(a.__lt__(b))   #  小于    a<b
print(a.__ne__(b))   #  不等于  a<>b 

# 两个日期差距 同datediff    日期差值计算另一个方法即:datetime.timedelta类;
print(a.__sub__(b))
print(a.__rsub__(b))  
#输出:
10 days, 0:00:00
-10 days, 0:00:00
1.4 返回周几
# 返回是周几 
date(2022,1,1).weekday()     # 周五 从0开始计
date(2022,1,1).isoweekday()  # 周六 从1开始计  

1.5 格式化、字符转换
# 格式化输出日期
a.isocalendar()/datetime.date.isocalendar(a) # 返回: 公历日期, year年份,week number周数,weekday星期数
a.isoformat() /datetime.date.isoformat(a)    # 返回: 符合ISO 8601标准 (YYYY-MM-DD) 的日期字符串

# 时间和字符串转换    字符转换在时间维度下都是这个写法 strftime/strptime
datetime.date.strftime(时间to字符串)
datetime.date.strptime(字符串to时间)
a.strftime("%Y-%m-%d")
a.strftime("%Y-%m-%d")
a.isoformat()
a.replace(1992,1,21)   # 传入参数为year,month,day,返回对应的新日期。

%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 当前时区的名称
%% %号本身
2. time类: 基本同date类
2.1 基础操作
from datetime import time
time类由hour小时、minute分钟、second秒、microsecond毫秒和tzinfo五部分组成
import datetime
datetime.time(12,30,59,21)
datetime.time(12,30)

2.2 时间比较 返回T/F

基本同datetime包一致;

# 时间大小比较 
相关方法包括:__eq__(...), __ge__(...), __gt__(...), __le__(...), __lt__(...), __ne__(...) 
与date类一致 ; 
a = datetime.date(2022,1,1)
b = datetime.date(2022,1,21)
print(a.__eq__(b))   #  等于    a == b   
print(a.__ge__(b))   #  大于等于 a>=b
print(a.__gt__(b))   #  大于    a>b
print(a.__le__(b))   #  小于等于 a<=b
print(a.__lt__(b))   #  小于    a<b
print(a.__ne__(b))   #  不等于  a<>b 
2.3 格式化、字符转换

基本同datetime包一致;

# 时间to字符串
from datetime import time
a = time(12,20,59,899)
a.strftime('%H:%M:%S') == a.__format__('%H:%M:%S')

# 格式化输出  
a = datetime.time(12,20,59,899)
a.isoformat()     # 返回标准时间格式:HH:MM:SS.mmmmmm+zz:zz

2.4 时区操作
# 返回timezone的偏移量 比较少用 
from datetime import datetime
time.utcoffset()
naive = datetime.now()
naive.tzinfo
naive.utcoffset()

# 返回timezone的名称。
datetime.tzname()
3. datetime类:

datetime类是date类和time类的合体 ,包含前两个类的全部参数, 相当于date类+time类.
除date类和time类的相同操作外,还有以下特性:

datetime.now()               # 获取当前时间,使用当前日期和时间构造对象,无参数,返回当前的日期和时间。
datetime.utcnow()            # 获取当前时间,使用当前日期和时间构造对象,无参数,返回当前的UTC(时间标准时间)日期和时间。
d = date(2021,1,21)
t = time(8,24,24)
datetime.combine(date,time)  # 使用date和time构造对象,传入参数为1个date对象和1个time对象,返回计算出的日期。
datetime.astimezone(datetime.now())  # 返回日期中加入时区概念;  
date(2021,1,21)      # 传入年月日 
time(8,24,24)        # 传入时分秒 
4. timedelta类:

用来计算二个datetime对象时间差值,等同于sql的datediff ,以及date类的__sub__,__rsub__方法(同1.3)

4.1 时间计算
import datetime 
datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
import datetime
day = datetime.datetime.now()
ddelay = datetime.timedelta(days=1)
wdelay = datetime.timedelta(weeks = 5)
ydelay = datetime.timedelta(weeks = 56)

print(day)
print(day - ddelay)  # 一天前的时间
print(day + ddelay)  # 一天后的时间
print(day - wdelay)  # 5 周前
print(day + wdelay)  # 5 周后
print(day - ydelay)  # 一年前
print(day + ydelay)  # 一年后
#输出:
2020-11-04 15:11:37.241980
2020-11-03 15:11:37.241980
2020-11-05 15:11:37.241980
2020-09-30 15:11:37.241980
2020-12-09 15:11:37.241980
2019-10-09 15:11:37.241980
2021-12-01 15:11:37.241980
二、import calendar

calendar主要用于日历获取、闰年判断等;


import calendar
calendar.month(2020, 11)               # 获取某月日历:calendar.month
calendar.leapdays(2016,2019)           # 返回在Y1,Y2两年之间(计头不计尾)的闰年总数。
calendar.isleap(2008)                  # 判断是否闰年 
calendar.calendar(2022,30,1,1,1)       # 打印某年日历 没啥用 
calendar.monthrange(2022, 1)           # 返回月份第一天的星期以及天数
(5, 30)
#(5, 30)解释:
#5 表示 2014 年 11 月份的第一天是周六
#30 表示 2014 年 11 月份总共有 30 天
calendar.weekday(2022,1,21)            # 返回某天是周几 从0开始 

三、import time

主要用于获取当前时间, 字符串日期转换等,和datetime的time类基本一致;


import time 
time.time()                    # 时间戳
time.mktime(time.localtime())  # 时间戳
time.struct_time(time.localtime())    # 时间元组:struct_time
time.localtime(time.time())           # 时间元组:struct_time
#输出:
time.struct_time(tm_year=2020, tm_mon=11, tm_mday=4, tm_hour=11, tm_min=25, tm_sec=46, tm_wday=2, tm_yday=309, tm_isdst=0)

time.asctime()   # 获取格式化时间 as ctime  'Tue Jan 18 15:38:57 2022'
time.strftime()  # 时间/字符串 转换 
time.strptime()  # 字符串转时间
time.localtime()
time.strptime("2022-01-21","%Y-%m-%d")
time.strftime("%Y-%m-%d",db)
time.strftime("%Y+%m+%d") 
结束语

时间插曲到此结束,基本熟练能满足90以上的时间处理需求,希望对大家有帮助。

希望本文有大家有帮助, 如有错误,欢迎指正。
本文地址:https://blog.csdn.net/weixin_41613094/article/details/122651561

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值