Event Every 823 Years

在推上看到 @localhost_8080 发的一条推

@localhost_8080: 刚看到一条状态:“今年7月份有5个周五,5个周六和5个周日,这种现象每823年才发生一次,叫做钱袋子。” 男朋友评论了这条状态:“扯,2013年3月就还是这样。” 噗哈哈…这就是考据癖的男朋友么~

看后觉得很有喜感,她男友同学很用心呀。然后就想到写个程序搜索一下就会知道哪个月份符合这个现象了。

先想如何实现:
因为4周是28天,所以只有31天的月份才可能出现这个现象,并且当且仅需1号这天是周五。 想到这里后,写程序就很简单了。

Python程序如下:

import datetime

FRIDAY = 4
MONTHS_TO_CHECK = (1, 3, 5, 7, 8, 10, 12)

def check_1st_friday(day):
    if day.weekday() == FRIDAY:
        return True
    return False


if __name__ == "__main__":
    year_from = 2000
    year_to = 2020

    for year in range(year_from, year_to + 1):
        for month in MONTHS_TO_CHECK:
            day = datetime.date(year, month, 1)
            if check_1st_friday(day):
                print day

结果如下(见这里):

2000-12-01
2002-03-01
2003-08-01
2004-10-01
2005-07-01
2006-12-01
2008-08-01
2009-05-01
2010-01-01
2010-10-01
2011-07-01
2013-03-01
2014-08-01
2015-05-01
2016-01-01
2016-07-01
2017-12-01
2019-03-01
2020-05-01

几乎每年都会出现一次嘛!