蓝桥杯必备模块——datetime 轻松应对各类时间问题

Hello

大家好🌼🌼,我是 @愿此后再无WA,可以叫我小A,也可以叫我愿愿💡💡,一位阳光帅小伙,对算法领域比较感兴趣。如果我的文章对您有用,欢迎持续关注,我们一起进步!🎈🎈


在这里插入图片描述
距离比赛还剩6天时间,今天把比较基础但非常重要的时间问题过一过。

datetime我就不讲解了,因为有两位巨佬讲的比我好很多,我也是通过他们才学会的。大家可以点击这里阅读文章,也可以点击这里观看视频。只有学会了这模块才能在下面的题目中更好的应用噢!


(你学会了吗?没学会不许往下看)

含2天数(国赛)

在这里插入图片描述

分析

单看题目应该能有大致的思路,就是年份如果有2的话就加1年的天数,如果月份有2的话就加一个月的天数,最后如果天有2的话就加1天。但是这样的话很容易出错,有些天数28天,有些天数29天,稍有不慎就错了。而datetime模块能巧妙避开这一问题。直接模拟每一天的日期,如果有2就加1。

import datetime

delta = datetime.timedelta(1)  # 时间差是1天

y1 = datetime.date(1900,1,1)
y2 = datetime.date(9999,12,31)

res = 0
# 位数不大可以直接模拟每一天得出结果
while y1 < y2:  
   if "2" in str(y1.year) or "2" in str(y1.month) or "2" in str(y1.day):
      res += 1
   y1 += delta

res += 1  # 因为最大值是y2,所以最后一个只能跳出循环在判断,因为12月有个2所以加1

print(res)   # 1994240

回文日期(省赛)

在这里插入图片描述
在这里插入图片描述

分析

这题目判断真的很繁琐,普通思路的话就是得到一个四位数和一个两位数,让他们组成题目中的两个回文字符串,如果不回文则加1,直到出现回文为止,思路容易想到,但边界判断非常容易出错。因此可以使用datetime模块的避开各种坑,因为给出日期与该日期的下一回文数间距不是很大,最多就上千这样,python一秒能处理的数据达到1e8,所以应对这个还是绰绰有余的,直接枚举每一个日期即可。当然,还能更好的优化,但由于时间有限我就不一一演示了。

import datetime

t = datetime.datetime.strptime(input(),"%Y%m%d")

d = t.date()

delta = datetime.timedelta(1)

d += delta  # 要先加1从下一位开始判断,因为可能给出的就是回文串

p1 = True
p2 = True

while p1 or p2:
   s = str(d).replace("-","")

   if s == s[::-1]:
      if p1:
         print(s)
         p1 = False
      y2 = s[:2]*2
      if s == y2+y2[::-1]:
         print(s)
         p2 = False
   d += delta

日期问题(省赛)

在这里插入图片描述
在这里插入图片描述
datetime功能多多,还能够结合try语句判断目标日期是否是合法日期,省去了还要进行闰年判断等繁琐步骤。

import datetime

def is_ava(y,m,d):
   try:
      w = datetime.date(y,m,d)
   except:
      return
   if w not in output:
      output.append(w)

   
date = input().split("/")
for i,j in enumerate(date):
   date[i] = int(j)
   
output = []

if date[0] >= 60:
   y = 19 * 100 + date[0]
else:
   y = 20 * 100 + date[0]

is_ava(y,date[1],date[2])

if date[2] >= 60:
   y = 19 * 100 + date[2]
else:
   y = 20 * 100 + date[2]

is_ava(y,date[0],date[1])
is_ava(y,date[1],date[0])

output.sort()
for i in output:
   print(i)

第几天(省赛)

在这里插入图片描述
datetime 也能够快速获取两日期时间差

import datetime

d1 = datetime.date(2000,1,1)
d2 = datetime.date(2000,5,4)
print((d2-d1).days+1) # 因为一月一号是第一天,所以作差后还要加1 

星期一(省赛)

在这里插入图片描述
datetime 还能判断是星期几。判断星期几有两个方法,一个是isoweekday(),一个是weekday()。前者是,星期几就返回数字几,星期一就返回数字1,星期天就返回数字7。后者是返回的数字减1,比如星期一就返回0,星期天就返回6。个人觉得还是isoweekday()好用些。

import datetime

d = datetime.date(1901,1,1)
delta = datetime.timedelta(1)
res = 0
while d.year < 2001:
    if d.isoweekday() == 1:
        res += 1
    d += delta

print(res)   # 5217

时间加法(模拟赛)

在这里插入图片描述
datetime.time 类不能进行时间差计算,所以需要使用datetime.datetime 类进行计算,使用该类需要初始化年月日,我们随便写一个就可以了。

import datetime

a, b = int(input()),int(input())
d = datetime.datetime(2022,4,3,a,b,0)

delta = datetime.timedelta(seconds=int(input())*60)

w = d + delta

print(w.hour)
print(w.minute)

时间显示(省赛)

在这里插入图片描述
这题我们需要先得到一个0时0分0秒的时间戳,然后再加上给出的秒数,最后将总值转换为新的时间并获取time即可。

import datetime

w = int(input()) // 1000
t = datetime.datetime(2020,2,2).timestamp()

p = datetime.datetime.fromtimestamp(t+w)

print(p.time())

延伸阅读

在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 13
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愿此后再无WA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值