【教学类-48-03】202402011“闰年”(每4年一次 2月有29日)世纪年必须整除400才是闰年)

文章介绍了如何使用Python代码在2000-2100年间提取闰年,强调了世纪年(如XX00年)只有能被400整除的才是闰年,例如2000年、2004年等是闰年,而1000年、1900年等不是。
摘要由CSDN通过智能技术生成

2000-2099年之间的闰年有25次,

343f3b9223fb413a88da1569edc56f8a.png

背景需求:

已经制作了对称年月的数字提取,和年月日相等的年份提取

【教学类-48-01】20240205对称的“年”和“月日”(如2030 0302)-CSDN博客文章浏览阅读84次。【教学类-48-01】20240205对称的“年”和“月日”(如2030 0302)https://blog.csdn.net/reasonsummer/article/details/136062477icon-default.png?t=N7T8https://blog.csdn.net/reasonsummer/article/details/136062477

【教学类-48-02】20240207“年”和“月”和“日”相等(如2012 1212)-CSDN博客文章浏览阅读834次,点赞25次,收藏22次。【教学类-48-02】20240207“年”和“月”和“日”相等(如2012 1212)https://blog.csdn.net/reasonsummer/article/details/136064823?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22136064823%22%2C%22source%22%3A%22reasonsummer%22%7D

修改代码,提取所有闰年(有2月29日的年,就是闰年)——今年龙年2024年就有2月29日。

参考代码

python 获取指定范围所有日期_python获取一段时间的所有日期对象-CSDN博客文章浏览阅读680次。python 获取指定范围所有日期方法有很多,这不是唯一的答案。可以根据自己的需要进行修改,代码如下:import datetimedef gen_dates(b_date, days): day = datetime.timedelta(days=1) for i in range(days): yield b_date + day * idef get_date_list(start=None, end=None): if start is Non_python获取一段时间的所有日期对象https://blog.csdn.net/love_521_/article/details/113983984?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-4-113983984-blog-110731910.235%5Ev43%5Epc_blog_bottom_relevance_base6&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-4-113983984-blog-110731910.235%5Ev43%5Epc_blog_bottom_relevance_base6&utm_relevant_index=9icon-default.png?t=N7T8https://blog.csdn.net/love_521_/article/details/113983984?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-4-113983984-blog-110731910.235%5Ev43%5Epc_blog_bottom_relevance_base6&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-4-113983984-blog-110731910.235%5Ev43%5Epc_blog_bottom_relevance_base6&utm_relevant_index=9

重点说明:

3e325cd98729442fa9be3257ca7c66f5.png

代码展示

'''
2900-2100年之间提取闰年
作者:阿夏
日期:2024年2月11日
'''

# https://blog.csdn.net/love_521_/article/details/113983984?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-4-113983984-blog-110731910.235%5Ev43%5Epc_blog_bottom_relevance_base6&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-4-113983984-blog-110731910.235%5Ev43%5Epc_blog_bottom_relevance_base6&utm_relevant_index=9
import datetime

def gen_dates(b_date, days):
    day = datetime.timedelta(days=1)
    for i in range(days):
        yield b_date + day * i
        
def get_date_list(start=None, end=None):
    if start is None:
        start = datetime.datetime.strptime('20180202', '%Y%m%d')
    else:
        start = datetime.datetime.strptime(start, '%Y%m%d')

    if end is None:
        # end = datetime.datetime.now()
        end = datetime.datetime.strptime('20280202', '%Y%m%d')
    else:
        end = datetime.datetime.strptime(end, '%Y%m%d')
        
    data = []
    for d in gen_dates(start, (end -start).days):
        m = datetime.datetime.strftime(d, '%Y%m%d')
        data.append(m)  # 如果你想添加的为日期类型 m改为 d即可
    print(data, data.__len__(), sep='\n')

    t=[]
    # 遍历
    for x in range(len(data)):
        b=data[x][0:2]# 提取“年”前2个数字 20240229的20
        y=data[x][2:4]# 提取“年”后2个数字 20240229的24
        m=data[x][4:6]# 提取“月”2个数字  20240229的02
        d=data[x][6:8]# 提取“日”2个数字  20240229的29
        if m=='02'and d=='29': # 如果2月有29天
            a=b+y
            # 合并年月日
            print('符合闰年的年份',a,'年')
            t.append(a)

    print('符合闰年的年份有',len(t),'次')
    print('符合闰年的年份列表',t)
      


# 起始日期
get_date_list(start='10000101', end='99991231')
# get_date_list(start='20000101', end='20991231')
# 40541

# 符合闰年的年份 2000 年
# 符合闰年的年份 2004 年
# 符合闰年的年份 2008 年
# 符合闰年的年份 2012 年
# 符合闰年的年份 2016 年
# 符合闰年的年份 2020 年
# 符合闰年的年份 2024 年
# 符合闰年的年份 2028 年
# 符合闰年的年份 2032 年
# 符合闰年的年份 2036 年
# 符合闰年的年份 2040 年
# 符合闰年的年份 2044 年
# 符合闰年的年份 2048 年
# 符合闰年的年份 2052 年
# 符合闰年的年份 2056 年
# 符合闰年的年份 2060 年
# 符合闰年的年份 2064 年
# 符合闰年的年份 2068 年
# 符合闰年的年份 2072 年
# 符合闰年的年份 2076 年
# 符合闰年的年份 2080 年
# 符合闰年的年份 2084 年
# 符合闰年的年份 2088 年
# 符合闰年的年份 2092 年
# 符合闰年的年份 2096 年
# 符合闰年的年份有 25 次
# 符合闰年的年份列表 ['2000', '2004', '2008', '2012', '2016', '2020', '2024', '2028', '2032', '2036', '2040', '2044', '2048', '2052', '2056', '2060', '2064', '2068', '2072', '2076', '2080', '2084', '2088', '2092', '2096']

结果:

符合闰年的年份 2000 年
符合闰年的年份 2004 年
符合闰年的年份 2008 年
符合闰年的年份 2012 年
符合闰年的年份 2016 年
符合闰年的年份 2020 年
符合闰年的年份 2024 年
符合闰年的年份 2028 年
符合闰年的年份 2032 年
符合闰年的年份 2036 年
符合闰年的年份 2040 年
符合闰年的年份 2044 年
符合闰年的年份 2048 年
符合闰年的年份 2052 年
符合闰年的年份 2056 年
符合闰年的年份 2060 年
符合闰年的年份 2064 年
符合闰年的年份 2068 年
符合闰年的年份 2072 年
符合闰年的年份 2076 年
符合闰年的年份 2080 年
符合闰年的年份 2084 年
符合闰年的年份 2088 年
符合闰年的年份 2092 年
符合闰年的年份 2096 年
符合闰年的年份有 25 次

根据以上数字判断:

1、100年里有25次闰年?

根据以上数字判断:从00开始反复加4年,直到96,(最大数字是99)一共25次。

00、04、08、12……92,96

那么公元1000年到公元9999年的“闰年”日期可能的数量

(9999-1000+1)*25/100=2250年(一百年里25次闰年)

2、并非所有的XX00年都是闰年

可是结果不是2250,而是2182,少了68年

6602b639f0dd43c8b5c3bd3c8adcd09c.png

查询网络才知道

d1e876448b92478e97552584a6156886.png

ab776624bccb430e9bcc4016797cb1e2.png

也就是说:跨世纪的“XX00年”必须能被400整除才算闰年。下图显示1000 年/400=2.5、3000年/400=7.5不是闰年(红色表示缺失),但2000年/400=5可以整除,就是闰年(绿色)

fcf3a3e2193644e7a441801a5ad722b1.png

因此我有写了一个年份代码,测试68次缺少的分别是那些“世纪年”

'''
2900-2100年之间提取闰年,世纪年XX00不是闰年
作者:阿夏
日期:2024年2月11日
'''
start=1000
end=9999

# 遍历所有年份
t=[]
for y in range(start,end+1):
    t.append(str(y))
# print(t)
    
oy=[]# 平年
ly=[]# 闰年
for x in t:
    if x[2:4]=='00': # 
        # print(x)
        num=int(x)/400
        if num==int(num):
            num=int(num)
            ly.append(x)
            # print(num)
            # print('闰年')
        else:
            num=float(num)
            # print(num)
            # print('非闰年')
            oy.append(x)
    else:
        pass


print('不符合闰年的世纪年(平年)有',len(oy),'次')
print('不符合闰年的世纪年(平年)列表',oy)

print('符合闰年的世纪年(闰年)有',len(ly),'次')
print('符合闰年的世纪年(闰年)列表',ly)
 

结果显示,公元1000-公元9999,一共是90个百年,一共有90次XX00年,其中22个世纪整年是闰年,可以被400整除,如1200、1600、2000年等,还有68个世纪整年是平年,如1000、4600、8100等。答案正确。

6adb475e8cdc48a49094b6b0965a56be.png

不符合闰年的世纪年(平年)有 68 次
不符合闰年的世纪年(平年)列表 ['1000', '1100', '1300', '1400', '1500', '1700', '1800', '1900', '2100', '2200', '2300', '2500', '2600', '2700', '2900', '3000', '3100', '3300', '3400', '3500', '3700', '3800', '3900', '4100', '4200', '4300', '4500', '4600', '4700', '4900', '5000', '5100', '5300', '5400', '5500', '5700', '5800', '5900', '6100', '6200', '6300', '6500', '6600', '6700', '6900', '7000', '7100', '7300', '7400', '7500', '7700', '7800', '7900', '8100', '8200', '8300', '8500', '8600', '8700', '8900', '9000', '9100', '9300', '9400', '9500', '9700', '9800', '9900']
符合闰年的世纪年(闰年)有 22 次
符合闰年的世纪年(闰年)列表 ['1200', '1600', '2000', '2400', '2800', '3200', '3600', '4000', '4400', '4800', '5200', '5600', '6000', '6400', '6800', '7200', '7600', '8000', '8400', '8800', '9200', '9600']

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿夏reasonsummer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值