python输出一年有多少天多少时分秒_python:计算在1901年1月1日至2000年12月31日间共有多少个星期天落在每月的第一天上...

# -*- coding: UTF-8 -*-

""" Created on 2017/4/2 @author: cat """

import logging

""" 根据下列信息计算在1901年1月1日至2000年12月31日间共有多少个星期天落在每月的第一天上? a) 1900.1.1是星期一 b) 1月,3月,5月,7月,8月,10月和12月是31天 c) 4月,6月,9月和11月是30天 d) 2月是28天,在闰年是29天 e) 公元年数能被4整除且又不能被100整除是闰年 f) 能直接被400整除也是闰年 输出格式: 一个正整数 """

logging.basicConfig(level=logging.DEBUG,

format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',

datefmt='%a, %d %b %Y %H:%M:%S')

def is_leap(year):

""" 是否是闰年 :param year: :return: 闰年-> true ; 平年-> false """

return year % 400 == 0 or (year % 4 == 0 and year % 100 != 0)

def year_total_day(year):

return 366 if is_leap(year) else 365

def month_total_day(year, month):

""" 一个月有多少天 :return: 当月的天数 """

if month < 1 or month > 12:

message = "month only range in [1,12] ! but current month is {0} ".format(month)

raise ValueError(message)

if month in [1, 3, 5, 7, 8, 10, 12]:

total = 31

elif month in [4, 6, 9, 11]:

total = 30

else:

if is_leap(year):

total = 29

else:

total = 28

# logging.warn("total === {0}".format(total))

return total

# print month_total_day(2003, 2)

# print year_total_day(0)

def d_value(srcyear, srcmonth, srcday, destyear, destmonth, destday):

""" temp函数,用于计算两个时间直接相差的天数 比如2016.3.25日 减去 2008.8.8日 等于多少天 :return: 相差的天数 """

if srcyear > destyear or (srcyear == destyear and srcmonth > destmonth) or (

srcyear == destyear and srcmonth > destmonth and srcday > destday):

message = "起始时间不得大于结束时间,这样子是无法比较的:\n" \

"起始时间:{0}/{1}/{2} 结束时间:{3}/{4}/{5}" \

.format(srcyear, srcmonth, srcday, destyear, destmonth, destday)

raise ValueError(message)

else:

# 都回到公元元年吧 1900.1.1 --> 0年的0月0日吧

st = 0

for y in range(0, srcyear):

st += year_total_day(y)

# logging.info("st1 = {0} , y = {1}".format(st,y))

for m in range(1, srcmonth):

st += month_total_day(srcyear, m)

# logging.info("st2 = {0}".format(st))

st += srcday

# logging.info("st = {0}".format(st))

dt = 0

for y in range(0, destyear):

dt += year_total_day(y)

# logging.info("yy = "+str(yy)+ "destday = "+str(destyear))

for m in range(1, destmonth):

dt += month_total_day(srcyear, m)

dt += destday

# logging.info("dt = {0}".format(dt))

return dt - st

def weekday(year, month, day):

""" 获取每天是星期几(基于1900.1.1 是周一) :param year: 2017 :param month: 04 :param day: 02 :return: 1 - 7 ==》周一 - 周日 """

ds = d_value(1900, 1, 1, year, month, day) + 1

weekday_num = ds % 7

return 7 if weekday_num == 0 else weekday_num

# print weekday(2017, 4, 2)

def get_all_lucky():

ret = []

cnt = 0

for year in range(1900, 2000 + 1):

for month in range(1, 12 + 1):

weekday_num = weekday(year, month, 1)

if weekday_num == 1:

cnt += 1

item = (year, month, 1)

ret.append(item)

print "size = {0}".format(cnt)

return ret

p = 0

for it in get_all_lucky():

p += 1

if p % 5 == 0:

print

print it,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值