本篇文章将介绍一下Datetime相关的使用
data
我们首先来看date的使用
import datetime
d = datetime.date(2018,8,2)
print(d) # 2018-08-02
在这里需要注意的是如果date里面写成(2018,08,02)是会报错的
如何获取当前时间
import datetime
tday = datetime.date.today()
print(tday) # 2018-12-16
print(tday.year) # 2018
# 当然这里我们去打印它的年月日都可以,在这里就不一一展示了
print(tday.weekday()) # 这里获取的是6,其实应该是7
# 那么很多小伙伴会在这里进行+1操作,其实不必,这里为我们提供了一个isoweekday()方法
print(tday.isoweekday()) #7
如何获取一周以后的时间
import datetime
tday = datetime.date.today() # 2018-12-16
week_later_day = datetime.timedelta(days=7)
print(tday+week_later_day) # 2018-12-23
如何获取距离某个特殊日子的时间
import datetime
tday = datetime.date.today()
# 假如我的生日是12月30日
birthday = datetime.date(2018,12,30)
print(birthday-tday) # 14 days, 0:00:00
# 那如果是多少秒呢?很多小伙伴估计会*24*60*3600,实际上我们没有必要这么做,它为我们提供了一个total_seconds()方法
print((birthday-tday).total_seconds()) # 1209600.0
time
time的使用
import datetime
tday = datetime.time(12,30,41)
print(tday) # 12:30:41
# 当然这里我们也可以输出小时、分钟、秒,如果我们输出年月日就会报错,time模块不支持该方法
print(tday.hour) #12
time和data的区别
从上面的例子中不难看出,data针对的是年月日的操作,而time针对的是时分秒的操作
而我们平时工作中用的比较多的是datetime模块,它是将两个模块的属性进行了统一,这个时候我们就可以调用它的年月日时分秒中每一个属性,不会报错
import datetime
tday = datetime.datetime(2018,12,16,12,30,45)
print(tday) # 2018-12-16 12:30:45
strftime()与strptime()
strftime()是将日期格式转化成字符串
import datetime
tday = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(tday) # 2018-12-16 12:45:10
tday = datetime.datetime.now().strftime("%b-%d-%y %H:%M:%S")
print(tday) # Dec-16-18 12:46:52
import datetime
tday = datetime.datetime.strptime('Dec-16-18 12:46:52','%b-%d-%y %H:%M:%S')
print(tday) # 2018-12-16 12:46:52
以上就是datetime的基本使用,接下来介绍几个在实际工作中遇到的问题该怎么去解决
从当前的时间减去一天
import datetime
tday = datetime.date.today() # 2018-12-16
tdelta = datetime.timedelta(days=1) #当然这里的days也可以为-1,相应的就变为tday+tdelta
print(tday-tdelta) # 2018-12-15
计算最近2个月的时间
import datetime
from dateutil.relativedelta import relativedelta
print(datetime.date.today() + datetime.timedelta(2*365/12)) # 2019-02-14
print(datetime.date.today() + relativedelta(months=2)) # 2019-02-16
这里我为了让大家看到上面那种计算是有误差的,我就选了2个月来进行区分,因为上面那种方法没有考虑哪一月有多少天
我们在做爬虫的时候经常会遇到类似时间格式的字符串“20181216123045”,这种如何将它变为常见的日期格式呢?
import datetime
from dateutil.parser import parse
t = '20181216123045'
print(parse(t).strftime('%Y-%m-%d %H:%M:%S')) # 2018-12-16 12:30:45
当我们得到这样的结果是非常高兴地,至少我在第一次用到这种方法的时候蛮开心的
有时候工作中会将在一个固定时间增加30s,我们该怎么做?
import datetime
a = datetime.datetime(2018,12,16,13,15,15)
b = a + datetime.timedelta(seconds=30)
print(b) # 2018-12-16 13:15:45
b = a + datetime.timedelta(seconds=50)
print(b) # 2018-12-16 13:16:05
如何找出每个月的最后一天?
大家可能首先会新建一个dict然后在里面写上每个月对应的天数,然后判断当前是第几月,然后再使用dict里面的值,这种方法就显得比较繁复,今天给大家带来一个比较好的方法
import datetime
def last_day_month(any_day):
next_month = any_day.replace(day = 28) + datetime.timedelta(days=4)# 这里要考虑2月有28天,随便加几天但是要保证能够凑到31天,这里可以是4,5,6.....
print(next_month) # 第一次2018-03-04 第二次2019-01-01
print(next_month.day) # 第一次4 第二次1
return next_month-datetime.timedelta(days=next_month.day)# 这里比较关键的一点就是要把多余的天数给减掉
print(last_day_month(datetime.date(2018,2,17))) # 2018-02-28
print(last_day_month(datetime.date(2018,12,16))) # 2018-12-31