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())