Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 检查生日是否在7天内_Python 3.x - Fatal编程技术网

Python 3.x 检查生日是否在7天内

Python 3.x 检查生日是否在7天内,python-3.x,Python 3.x,我目前有两本字典是这样设置的 D = {'Jan': {'days': 31, 'nextmo': 'Feb', 'prevmo': 'Dec'}, 'Feb': {'days': 29, 'nextmo': 'Mar', 'prevmo': 'Jan'}, 'Mar': {'days': 31, 'nextmo': 'Apr', 'prevmo': 'Feb'}, 'Apr': {'days': 30, 'nextmo': 'May', 'prevmo': 'Mar'}, 'May'

我目前有两本字典是这样设置的

D = {'Jan': {'days': 31, 'nextmo': 'Feb', 'prevmo': 'Dec'},
 'Feb': {'days': 29, 'nextmo': 'Mar', 'prevmo': 'Jan'},
 'Mar': {'days': 31, 'nextmo': 'Apr', 'prevmo': 'Feb'},
 'Apr': {'days': 30, 'nextmo': 'May', 'prevmo': 'Mar'}, 
 'May': {'days': 31, 'nextmo': 'Jun', 'prevmo': 'Apr'},
 'Jun': {'days': 30, 'nextmo': 'Jul', 'prevmo': 'May'},
 'Jul': {'days': 31, 'nextmo': 'Aug', 'prevmo': 'Jun'},
 'Aug': {'days': 31, 'nextmo': 'Sep', 'prevmo': 'Jul'}, 
 'Sep': {'days': 30, 'nextmo': 'Oct', 'prevmo': 'Aug'},
 'Oct': {'days': 31, 'nextmo': 'Nov', 'prevmo': 'Sep'},
 'Nov': {'days': 30, 'nextmo': 'Dec', 'prevmo': 'Nov'},
 'Dec': {'days': 31, 'nextmo': 'Jan', 'prevmo': 'Jan'},}

birthdays =    {'John': ('Mar', 23, '1989'), 
'Johns_twin': ('Mar', 28, '1989'),
'Susan': ('Feb', 16, '1989'),
'Alan': ('Sep', 4, '1989'), 'Kevin': ('Dec', 23, '1989'), 'Murad': 
('Jan', 3, '1989'), 'Sandeep': ('Apr', 2, '1989'), 'James': ('Apr', 3, 
'1989'), 'Karen': ('Apr', 2, '1989'), 'Wiktoria': ('Jul', 14, '1989'), 
'Rogan': ('Jun', 29, '1989'), 'Fraser': ('Jan', 4, '1989'), 'Cameron': 
('Oct', 1, '1989')}
{'John': ('Mar', 23, '1989'), 'Johns_twin': ('Mar', 28, '1989')
基本上,如果有人输入日期“Apr”“2”,我希望它返回7天范围内的所有生日(3月26日->4月9日)

我的大部分代码都在工作,并且知道如何完成它,但是我的工作方式似乎非常长。是否有更简单的解决方案(最好不必导入datetime或任何其他模块)

我从函数中得到的代码如下。这是在进行手动检查,但要使其适用于所有场景,代码的长度可能需要是此代码长度的2-3倍

def adder(bday_month_in,bday_day_in):
date_check1 = D[bday_month_in]['prevmo']
if 7 <= bday_day_in <= 21:
    max_bday = bday_day_in + 7
    min_bday = bday_day_in - 7
    print('The desired range is between', min_bday, 'and',max_bday, "of", bday_month_in)
    for key, (valX, valY, valZ) in birthdays.items():
        if valX == bday_month_in:
            if min_bday <= valY <= max_bday:
                print(key, (valX, valY, valZ))
else:
    if bday_day_in <= 6: #Apr 2
        adder = 7 - bday_day_in #5
        prev_mo = D[bday_month_in]['prevmo']  #month_max = Mar
        prev_date = D[prev_mo]['days'] - adder #days in mar (31) - 5 = 26
        print(prev_mo,prev_date)
        future_date = bday_day_in + 7
        print('The desired range is between', prev_date, "of", prev_mo,'and',future_date,bday_month_in)
        for key, (valX, valY, valZ) in birthdays.items():
            if future_date > valY and valX == bday_month_in:
                        print(key, (valX, valY, valZ))
            if valY > prev_date and valX == prev_mo:
                        print(key, (valX, valY, valZ))
    if bday_day_in => 21: #Apr 2
        adder = 7 - bday_day_in #5
        prev_mo = D[bday_month_in]['prevmo']  #month_max = Mar
        prev_date = D[prev_mo]['days'] - adder #days in mar (31) - 5 = 26
        print(prev_mo,prev_date)
        future_date = bday_day_in + 7
        print('The desired range is between', prev_date, "of", prev_mo,'and',future_date,bday_month_in)
        for key, (valX, valY, valZ) in birthdays.items():
            if future_date > valY and valX == bday_month_in:
                        print(key, (valX, valY, valZ))
            if valY > prev_date and valX == prev_mo:
                        print(key, (valX, valY, valZ))

                    #print('ValY',valY,valZ)
                   # print('prev_date',prev_date)
                  #  print('future_date',future_date)
                   # if future_date <= valY <= prev_date:

    else:
        valuer_max = days_in_that_month - 7
        month_max = D[bday_month_in]['prevmo']  # 'Mar'
        print(valuer_max,month_max)
def加法器(日月英寸,日英寸):
日期检查1=D[b日期月份]['prevmo']
如果7个上一个日期和valX==上一个月:
打印(键,(valX,valY,valZ))
#打印('ValY',ValY,valZ)
#打印('上一个日期',上一个日期)
#打印('未来日期',未来日期)

#如果future_date在没有日期的情况下执行此任务,则api并非微不足道,因为结果取决于是否存在闰日(2月29日)

这也意味着,为了获得正确的结果,我们需要知道我们所处的年份。例如,如果参考日为3月2日,则在非闰年中,2月23日在7天范围内,但在闰年中,它不在7天范围内

您确实应该使用
datetime
包,并将日期转换为此类
datetime
对象

下面是代码的外观:

import datetime

def around(birthdays, day, maxdays):
    result = []
    for name, bday in birthdays.items():
        try:
            mappedbday = bday.replace(year=day.year)
        except ValueError: # 29 February cannot be mapped to non-leap year
            mappedbday = bday.replace(year=day.year, day=28) # Choose 28-Feb instead
        if abs((mappedbday - day).days) <= maxdays:
            result.append((name, str(mappedbday)))
    return result


# Encode birthday values as datetime objects
birthdays = {
    'John': datetime.date(1989, 3, 23), 
    'Johns_twin': datetime.date(1989, 3, 28),
    'Susan': datetime.date(1989, 2, 16),
    'Alan': datetime.date(1989, 9, 4),
    'Kevin': datetime.date(1989, 12, 23), 
    'Murad': datetime.date(1989, 1, 3), 
    'Sandeep': datetime.date(1989, 4, 2), 
    'James': datetime.date(1989, 4, 3), 
    'Karen': datetime.date(1989, 4, 2), 
    'Wiktoria': datetime.date(1989, 7, 14),
    'Rogan': datetime.date(1989, 6, 29),
    'Fraser': datetime.date(1989, 1, 4),
    'Cameron': datetime.date(1989, 10, 1)
}

# Example:
month = 'Apr'
day = 2
# Convert month's abbreviated name to month number:
monthnum = datetime.datetime.strptime(month,'%b').month
# Create a date object: we need a year, as result may differ in leap year
refdate = datetime.date(2018, monthnum, day)

print(around(birthdays, refdate, 7))

日期仅使用
str
函数格式化,但您当然可以选择不同的格式。

如果不使用日期/时间模块,您必须编写逻辑来处理闰年。对我来说似乎效率不高。是否有不使用
datetime
的具体原因?它的存在正是为了帮助疯狂的日期和时间!主要原因是我没有一年的时间。最初提供的词典是name/month/day。我在尝试实现datetime时添加了年份,但最终返回到上面的方法。无论datetime如何使用,我都希望得到指导,因为我无法让它按预期工作
[('Johns_twin', '2018-03-28'), 
 ('Sandeep', '2018-04-02'), 
 ('James', '2018-04-03'), 
 ('Karen', '2018-04-02')]