Python3的日期/时间处理模块
datetime的格式化符号
格式化符号 |
表示 |
---|---|
%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 |
当前时区的名称 |
获取日期和时间
1. datetime
# 获取当前日期和时间
print(datetime.now())
2017-08-17 14:38:27.417507
print(datetime.now().month) print(datetime.now().minute)
# 构造指定日期和时间
dt=datetime(2017,6,25,9,0,1)
print(dt)
2017-06-25 09:00:01 # datetime本身有日期时间格式的容错
dt=datetime(2017,6,25,25,00)
ValueError: hour must be in 0..23
2. calendar
# 获取某个月的日历
import calendar
print(calendar.month(2017,8))
August 2017
Mo Tu We Th Fr Sa Su
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
datetime <—> timestamp
# datetime——>timestamp: datetime.timestamp()
dt=datetime(2017,6,25,9,0,1)
print(dt.timestamp())
1498395601.0 # timestamp()——>datetime: datetime.fromtimestamp(t)
t=1498395601.0
print(datetime.fromtimestamp(t)) #本地时间2017-06-25 09:00:01
print(datetime.utcfromtimestamp(t)) #UTC时间2017-06-25 13:00:01
str<——>datetime:strptime(str,格式化字符串)
# str——>datetime:strptime(str,格式化字符串)
text="2017-06-25 12:01:02"
cdate=datetime.strptime(text,'%Y-%m-%d %H:%M:%S')
print(cdate,type(cdate))
2017-06-25 12:01:02 <class 'datetime.datetime'>
0:00:00.001838 //执行时间 # 实际上由于strptime()的性能较差,我们可以自定义一个类似下面这样的函数来实现str—>datetime
def parse_dt(*args):
if len(args)==1:
y,mo,r=args[0].split('-')
return datetime(int(y),int(mo),int(r))
else:
y,mo,r=args[0].split('-')
h,mi,s=args[1].split(':')
return datetime(int(y),int(mo),int(r),int(h),int(mi),int(s)) dt=parse_dt('2017-6-25','12:01:02')
print(dt,type(dt))
2017-06-25 12:01:02 <class 'datetime.datetime'>
0:00:00.000019 //执行时间
# datetime——>str:strftime(datetime,格式化字符串)
dt=datetime(2017,6,25,9,0,1)
cdate=datetime.strftime(dt,'%A %B %d,%Y') //根据python格式化格式来输出想要的结果即可
print(cdate)
Sunday June 25,2017
时间计算/判断
1. 计算时间间隔
d1=parse_dt('2017-8-21','14:00:00')
d2=parse_dt('2017-8-21','18:30:00') #计算时间差
print(type(d2-d1))
#<class 'datetime.timedelta'> print((d2-d1))
#4:30:00 print((d2-d1).days)
#0 print((d2-d1).seconds)
#16200
# datetime加减:时间往后或往前计算
dt=datetime.now()
print(dt)
#2017-08-21 09:43:47.183234 print(dt+timedelta(hours=1))
#2017-08-21 10:43:47.183234 print(dt-timedelta(hours=1))
#2017-08-21 08:43:47.183234 print(dt-timedelta(days=1,hours=1))
#2017-08-20 08:43:47.183234
2. 判断某天是周几
#判断某天是周几
def gz_weekday(year,month,day):
x=calendar.weekday(year,month,day)
if x==0:
print("星期一")
if x==1:
print("星期二")
if x==2:
print("星期三")
if x==3:
print("星期四")
if x==4:
print("星期五")
if x==5:
print("星期六")
if x==6:
print("星期日")
gz_weekday(2017,8,17)
星期四
3. 判断闰年
#判断是否为闰年
print(calendar.isleap(2020))
#True
print(calendar.isleap(2017))
#False
print(calendar.leapdays(2000,2020))
#5
4. 计算上一个周五/下一个周五
#计算上一个星期五/下一个星期五
from dateutil.relativedelta import relativedelta
from dateutil.rrule import * dt=datetime.now()
print(dt)
#2017-08-21 11:21:40.470703 print(dt+relativedelta(weekday=FR)) #其他Mo、等都同理
#2017-08-25 11:21:40.470703 print(dt+relativedelta(weekday=FR(-1)))
#2017-08-18 11:21:40.470703
5. 计算某个月有几天
#计算某个月有几天
import calendar
# monthrange(year, month)
# Return weekday (0-6 ~ Mon-Sun) and number of days (28-31) for year, month.
print(calendar.monthrange(2018,2))
#(3, 28) print(calendar.monthrange(2017,10))
#(6, 31)
补充:calender模块常见函数
序号 |
函数及描述 |
---|---|
1 |
calendar.calendar(year,w=2,l=1,c=6) 返回一个多行字符串格式的year年年历,3个月一行,间隔距离为c。 每日宽度间隔为w字符。每行长度为21* W+18+2* C。l是每星期行数。 |
2 |
calendar.firstweekday( ) 返回当前每周起始日期的设置。默认情况下,首次载入caendar模块时返回0,即星期一。 |
3 |
calendar.isleap(year) 是闰年返回True,否则为false。 |
4 |
calendar.leapdays(y1,y2) 返回在Y1,Y2两年之间的闰年总数。 |
5 |
calendar.month(year,month,w=2,l=1) 返回一个多行字符串格式的year年month月日历,两行标题,一周一行。每日宽度间隔为w字符。每行的长度为7* w+6。l是每星期的行数。 |
6 |
calendar.monthcalendar(year,month) 返回一个整数的单层嵌套列表。每个子列表装载代表一个星期的整数。Year年month月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。 |
7 |
calendar.monthrange(year,month) 返回两个整数。第一个是该月的星期几的日期码,第二个是该月的日期码。日从0(星期一)到6(星期日);月从1到12。 |
8 |
calendar.prcal(year,w=2,l=1,c=6) 相当于 print calendar.calendar(year,w,l,c). |
9 |
calendar.prmonth(year,month,w=2,l=1) 相当于 print calendar.calendar(year,w,l,c)。 |
10 |
calendar.setfirstweekday(weekday) 设置每周的起始日期码。0(星期一)到6(星期日)。 |
11 |
calendar.timegm(tupletime) 和time.gmtime相反:接受一个时间元组形式,返回该时刻的时间辍(1970纪元后经过的浮点秒数)。 |
12 |
calendar.weekday(year,month,day) 返回给定日期的日期码。0(星期一)到6(星期日)。月份为 1(一月) 到 12(12月)。 |