Python的日期函数datetime(算法比赛)

216 阅读2分钟

算法比赛中一般会涉及到日期的题目,例如蓝桥杯,就曾经出现过

一定要区分日期(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;
}