给定一个 4-5-4 日历和一个日期,我如何确定该日期属于哪个财政周?

Given a 4-5-4 calendar and a date, how do I determine what fiscal week that date falls in?

我们有一个 4-5-4 日历,其中财政年度从 2 月的星期日开始。对于 2016 财年,第一天实际上是在一月份 -- 即 1 月 31 日,星期日。

我需要编写一个函数,将日期作为输入并 return 是财政周,例如 201552,这将是 2015 财政年度的第 52 个财政周。

我认为第一步是确定输入日期的会计年度的开始日期。我知道它总是星期日,但我怎么知道它是日历二月的第一个星期日,还是日历一月的最后一个星期日?

(幸运的是,出于此功能的目的,我可以忽略偶尔的第 53 周;在这种情况下,我可以只 return 第 52 周。那是因为(有人告诉我)有 53 个财政周的年份是不可预测的(无论如何在这家公司)并且是由人的心血来潮决定的。)

有什么建议吗?

更新:

我收到了一份文件,其中包含我们公司从 2005 财年到 2017 财年的财年日历。我看到的模式是:

我认为这给了我我所需要的。

我认为第一步是找到输入日期所在年份的 2 月 1 日是星期几。

接下来,找到 FY 的第一天,它基于一周中的 2 月 1 日。如果是星期一、星期二或星期三,则 FY 的第一天是一月的最后一个星期日。否则,FY 的第一天是一月的第一个星期日。

接下来判断输入的日期是那个FY还是之前的FY

然后,如果输入日期是前一个FY,则获取该FY的第一天。

接下来,计算从 FY 的第一天到输入日期的那一天的天数。除以 7,向上舍入到下一个整数。那是财年周。

到那时,我就会知道输入日期的财年和财周,并且可以return了。

更新:

这是我所拥有的;它在我的测试中有效:

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