2015-06-16 3 views
0

У нас есть календарь 4-5-4, в котором финансовый год начинается в воскресенье в феврале. В 2016 году этот первый день на самом деле в январе - это воскресенье, 31 января.Учитывая календарь 4-5-4 и дату, как определить, какая фискальная неделя, на которую выпадает дата?

Мне нужно написать функцию, которая принимает дату в качестве входных данных и возвращает фискальную неделю, такую, как 201552, который был бы 52-й фискальной недели финансового года 2015.

Я думаю, что первый шаг выясняя из начального дня финансового года ввода. Я знаю, что это всегда воскресенье, но откуда я узнаю, что это первое воскресенье в календаре Февраль или последнее воскресенье в календаре Январь?

(К счастью для этой функции, я могу проигнорировать случайную 53-я неделя, я могу просто вернуть 52-ю неделю в этом случае. Это потому, что (я сказал), что годы, имеющие 53 фискальных недели, не предсказуемы (в этой компании в любом случае) и определяются по прихоти человека.)

Любые предложения?

UPDATE:

Я был дан документ с FY календарями для нашей компании с 2005 финансового года через FY2017. Образец, который я вижу, таков:

  • Если 1 февраля - понедельник, вторник или среда, то первый день FY - последнее воскресенье января.
  • Если 1 февраля - четверг, пятница, суббота или воскресенье, то первый день FY - первое воскресенье февраля.

Я думаю, что это дает мне то, что мне нужно.

+2

Какой язык? Какой код вы пробовали до сих пор? –

+0

Я использую Excel VBA. Все, что у меня есть до сих пор, - это функция, которая принимает дату как входной сигнал и устанавливает переменные для года, месяца и дня месяца для этого ввода. Это еще не вопрос кода; сначала мне нужно выяснить, что попробовать. –

+0

@GregLovern Пожалуйста, отредактируйте свой вопрос, чтобы уточнить и добавить детали, а не размещать как комментарии. Кроме того, добавьте язык программирования в качестве тега в вопросе.Этот тег используется средством автоматического форматирования кода в Stack Overflow. –

ответ

0

Я думаю, что первым шагом будет поиск дня недели на 1 февраля года ввода.

Далее, найдите первый день FY, который основан на том 1-м 1-м дне недели. Если это Mon, Tue или Wed, то первый день FY - последнее воскресенье января. В противном случае, первый день FY - первое воскресенье января.

Затем определите, находится ли дата ввода в этом FY или предыдущем.

Затем, если дата ввода находится в предыдущем FY, получите первый день этого FY.

Затем подсчитывайте дни с первого дня FY до дня ввода даты. Разделите на 7, округляя UP до следующего целого числа. Это неделя FY.

В этот момент я буду знать дату FY в дате ввода и неделю FY и могу ее вернуть.

UPDATE:

Вот что у меня есть; он работает в моих тестах:

Public Function ConvertDateToRawFYWeek(convert_date As Date) As String 
'Fiscal year starts on either: 
    'the last Sunday in January (if Feb 1st is a Mon, Tue, or Wed), OR: 
    'the first Sunday in February (if Feb 1st is Thur, Fri, Sat, or Sun). 

    Dim iCalendarYearOfInputDate As Long, iInputMonth As Long, iInputDay As Long, iTmpYear As Long 
    Dim iFebFirstOfTmpYear As Long, strFebFirstWeekdayOfTmpYear As String 
    Dim iFirstDayofFYOfTmpYear As Long 
    Dim iFiscalYearOfInputDate As Long 
    Dim iDayOfInputDate As Long 
    Dim iDayOfFY As Long, iWeekOfFY As Long, strWeekOfFY As String 
    Dim bDone As Boolean 

    iCalendarYearOfInputDate = Year(convert_date) 
    iInputMonth = Month(convert_date) 
    iInputDay = Day(convert_date) 
    iDayOfInputDate = CLng(DateValue(convert_date)) 


    bDone = False 'init. 
    iTmpYear = iCalendarYearOfInputDate 'init. 
    Do 

      '***get the day of the week of feb 1st of tmp date's year: 
      iFebFirstOfTmpYear = DateSerial(iTmpYear, 2, 1) 
      strFebFirstWeekdayOfTmpYear = Format(iFebFirstOfTmpYear, "DDDD") 

      '***get the first day of the FY of the tmp date's year: 
      Select Case strFebFirstWeekdayOfTmpYear 
       Case "Monday" 
        'first day of the tmp year's FY is the last Sunday of January, which for the tmp year is Jan 31st: 
        iFirstDayofFYOfTmpYear = iFebFirstOfTmpYear - 1 
       Case "Tuesday" 
        'first day of the tmp year's FY is the last Sunday of January, which for the tmp year is Jan 30th: 
        iFirstDayofFYOfTmpYear = iFebFirstOfTmpYear - 2 
       Case "Wednesday" 
        'first day of the tmp year's FY is the last Sunday of January, which for the tmp year is Jan 29th: 
        iFirstDayofFYOfTmpYear = iFebFirstOfTmpYear - 3 
       Case "Thursday" 
        'first day of the tmp year's FY is the first Sunday of February, which for the tmp year is Feb 4th: 
        iFirstDayofFYOfTmpYear = iFebFirstOfTmpYear + 3 
       Case "Friday" 
        'first day of the tmp year's FY is the first Sunday of February, which for the tmp year is Feb 3rd: 
        iFirstDayofFYOfTmpYear = iFebFirstOfTmpYear + 2 
       Case "Saturday" 
        'first day of the tmp year's FY is the first Sunday of February, which for the tmp year is Feb 2nd: 
        iFirstDayofFYOfTmpYear = iFebFirstOfTmpYear + 1 
       Case "Sunday" 
        'first day of the tmp year's FY is the first Sunday of February, which for the tmp year is Feb 1st: 
        iFirstDayofFYOfTmpYear = iFebFirstOfTmpYear 
      End Select 

      '***get the fiscal year of the input date: 
      If iDayOfInputDate >= iFirstDayofFYOfTmpYear Then 
       iFiscalYearOfInputDate = iTmpYear 
       bDone = True 
      Else 
       iTmpYear = iTmpYear - 1 'loop again. 
      End If 

    Loop Until bDone 


    '***count the days from that first day of the FY, to the day of the input date. 
    'Divide by 7, rounding UP to the next integer. That is the FY week. 
    iDayOfFY = iDayOfInputDate - iFirstDayofFYOfTmpYear 
    iWeekOfFY = Round((iDayOfFY/7) + 0.50000000000001) 'round up to next integer. 
    strWeekOfFY = Format(iWeekOfFY, "00") 

    strFY = Format(iTmpYear, "0000") 

    ConvertDateToRawFYWeek = strFY & strWeekOfFY 

End Function 
Смежные вопросы