2017-02-16 5 views
-1

Каким будет наиболее эффективный способ сопоставить график 6 дней на рабочую неделю (за исключением выходных)? Существуют ли какие-либо существующие алгоритмы, которые подходят для этой цели? Вариант использования должен состоять в том, чтобы выполнить текущую дату, выполнить функцию и вывести соответствующий День.Алгоритм отображения 6-дневного графика на рабочую неделю?

Например:

  Сегодня 2/15/2017 будет День 1. day(2/15/2017) = "Day 1"
  Завтра, 2/16 будет День 2. day(2/16/2017) = "Day 2"
  пятницу будет день 3. day(2/17/2017) = "Day 3"
  понедельник будет День 4. day(2/20/2017) = "Day 4"
  т.д.

идеальный случая это будет выполнено в Python, но любая реализация будет работать

+0

есть ли способ сделать это, что бы работать без библиотеки, например, в JS? – Sman

ответ

2

Вы можете легко создать генератор возвращающегося даты, начиная с сегодняшнего дня с timedelta. Тогда вы можете отфильтровать выходные с date.weekday и обернуть результат в enumerate, чтобы получить индекс для каждого дня:

from datetime import date, timedelta 
from itertools import count 
import calendar 

WORK_WEEK = 6 

today = date.today() 

# Generator producing successive dates starting from today 
dates = (today + timedelta(days=i) for i in count()) 

# Generator filtering weekends 
work_dates = (d for d in dates if d.weekday() <= calendar.FRIDAY) 

for i, d in enumerate(work_dates): 
    # Print only 10 first days 
    if i == 10: 
     break 
    print('{} -> Day {}'.format(d, i % WORK_WEEK + 1)) 

Выход:

2017-02-16 -> Day 1 
2017-02-17 -> Day 2 
2017-02-20 -> Day 3 
2017-02-21 -> Day 4 
2017-02-22 -> Day 5 
2017-02-23 -> Day 6 
2017-02-24 -> Day 1 
2017-02-27 -> Day 2 
2017-02-28 -> Day 3 
2017-03-01 -> Day 4 
+0

+1 генераторы ftw. @Shaun вопрос был о python - так что эта работа в javascript выходит за рамки. – Shadow

0

Если я правильно понимая, вы можете создать экземпляр объекта даты, а затем использовать timedelta добавить соответствующие дни, отфильтровывать уикэнды, используя список понимание. Кроме того, вы можете проверить, если сегодня является частью уик-энда или не первая:

import datetime 

today = datetime.date.today() 

if today.weekday() < 5: # this if-else ensures today isn't a weekend 
    first = today 
else: 
    delta = 7 - today.weekday() 
    first = today + datetime.timedelta(days=delta) 

work_days = [first] 
num = 1 
while len(work_days) < 6: # get the next 5 week days, since we have the first already 
    curr = first + datetime.timedelta(days=num) 
    if curr.weekday() < 5: 
     work_days.append(curr) 
    num += 1 
+0

Это не исключает выходные дни в соответствии с запросами. – Shadow

+0

@shadow oops, не видели исключающую часть выходных дней, исправляя сейчас –

1

Учитывая дату, которая является «день 1», это возвращаю количество графика дня для любой заданной даты:

import datetime 

def day_number(day1, target_date): 
    days = (target_date - day1).days 
    weeks = days // 7 
    workdays = weeks * 5 
    whole_week = day1 + datetime.timedelta(days=weeks*7) 
    for d in range(days % 7): 
    day = whole_week + datetime.timedelta(days=d) 
    if day.weekday() < 5: 
     workdays += 1 
    return workdays % 6 + 1 
0

Судя из того, что вы сказали в вашей проблеме, вы не просто хотите день недели, вы хотите, как много буднего дня с даты начала. Это было бы моим решением. Это исключает посторонние исключения, такие как праздники.

from datetime import date 


def day(day, month, year): 
    # Create starting date, in this case 10th Feb, 2017 
    # Let's assume the starting date is a weekday 
    startingDate = date(2017, 2, 10) 

    # Create ending date based on user input 
    endingDate = date(year, month, day) 

    # First check if the user input is a weekend 
    if endingDate.weekday() == 5 or endingDate.weekday() == 6: 
     return "This is not a workday" 

    # Calculate the total days in between the two dates 
    totalDays = (endingDate - startingDate).days 

    #Subtract two days for every weekend 
    totalDays -= int(totalDays/7)*2 

    return "Day " + str(totalDays) 


def main(): 
    print(day(14, 2, 2017)) 


main() 
0

Вы можете Yous momentjs, его хорошая библиотека, которая поможет вам с календарями, как этот

moment().subtract(10, 'days').calendar(); // 02/05/2017 
moment().subtract(6, 'days').calendar(); // Last Thursday at 9:06 PM 
moment().subtract(3, 'days').calendar(); // Last Sunday at 9:06 PM 
moment().subtract(1, 'days').calendar(); // Yesterday at 9:06 PM 
moment().calendar();      // Today at 9:06 PM 
moment().add(1, 'days').calendar();  // Tomorrow at 9:06 PM 
moment().add(3, 'days').calendar();  // Saturday at 9:06 PM 
moment().add(10, 'days').calendar();  // 02/25/2017 

также Инсталляции очень легко установить беседку момент --save # становой НПМ установить момент - -save # НПМ Install-Package Moment.js # NuGet SPM установить момент --save # SPM метеор добавить momentjs: момент # метеорит

+0

Вопрос 'pyton', а не' javascript'. – trincot

+0

И это не отвечает на вопрос - вы не упускаете выходные. – Shadow