算法比赛中一般会涉及到日期的题目,例如蓝桥杯,就曾经出现过
一定要区分日期(datetime),时间(time),和日历(calendar)这三个东西
对于日期题目,我们普遍要考虑到闰年,非闰年,天数,2月的天数,30天和31天
对于这种问题,写代码比较麻烦一点,虽然不难,但是没必要浪费时间,py的datetime函数是个好东西datetime是date不是data一定牢记,不然会吃大亏(自身经验),
部分内容参考这篇(Python日期常用函数)
判断合法日期的与0年0月0日有多少天
def day(t):
y = int(t / 10000)
m = int(t / 100) % 100
d = t % 100
a[2] = 29 if (y % 4 == 0 and y % 100 != 0 or y % 400 == 0) else 28
while m != 0:
m -= 1
d += a[m]
while y != 0:
y -= 1
d += 366 if (y % 4 == 0 and y % 100 != 0 or y % 400 == 0) else 365
return d
a = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
模块
import datetime
案例
20110412
需要将上面的数字转化为日期
s = "20110412"
date = datetime.date(int(s[:4]),int(s[4:6]),int(s[6:]))
date可以将数字形式的转化为日期对象 在实现日期进行加减的时候可以直接使用日期对象进行加减,下面是对两个日期进行的减法操作,主要计算两个日期之间有多少天。
s = input()
s2 = input()
st = datetime.date(int(s[:4]),int(s[4:6]),int(s[6:]))
en = datetime.date(int(s2[:4]),int(s2[4:6]),int(s2[6:]))
dayt = en-st if en>st else st-en
print(dayt.days+1)
判断回文日期的话有个小技巧
只对年份进行遍历,年份加上年份的倒序,判断它是不是合法日期就可以了, 判断合法日期有个技巧就是使用Py的date函数,如果不是合法函数,就会产生报错,这个可以用try去解决
date对象它有对应的年月日, 例如上面的st.day,t.year,st.month都可以输出它对应的内容,
replace(2003,02,22)
替换原来的日期
timetuple() 返回日期元组
weekday() 返回对应的星期
isocalendar() 返回对应的年份的第几周,周几,是个三元组
timedelta() 这个是日期的间隔函数,里面可以是days,hours,years,months,weekdays
py的日期的处理,不要太友好了。
c++的部分
每个月的天数
int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
判断闰年平年
int is_leap(int year)
{
if (year % 4 == 0 && year % 100 || year % 400 == 0)
return 1;
return 0;
}
计算当前年当前月的天数
int get_month_day(int year, int month)
{
int res = days[month];
if (month == 2 && is_leap(year)) res += 1;
return res;
}