首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >给定4-5-4日历和日期,我如何确定该日期属于哪个财政周?

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

Stack Overflow用户
提问于 2015-06-16 19:39:09
回答 1查看 1.7K关注 0票数 1

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

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

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

(幸运的是,出于这个函数的目的,我可以忽略偶尔的第53周;在这种情况下,我可以返回52周。这是因为(我被告知)有53个财政周的年份是不可预测的(不管怎么说),而且是由人的想法决定的。

有什么建议吗?

更新:

从FY2005到FY2017,我收到了一份带有FY日历的文件。我看到的模式是:

  • 如果2月1日是星期一、星期二或星期三,那么财政年度的第一天是一月的最后一个星期日。
  • 如果2月1日是星期四,星期五,星期六或星期日,那么财政年度的第一天是二月的第一个星期日。

我想这给了我我需要的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-16 20:59:39

我认为第一步是为输入日期的2月1日找到一周中的一天。

接下来,找到FY的第一天,这是基于2月1日的一周。如果是星期一,图,或韦德,那么FY的第一天是一月的最后一个星期天。否则,FY的第一天是一月的第一个星期日。

接下来,确定输入日期是在那个FY中还是在前面的那个。

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

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

在这一点上,我将知道输入日期的财政年度和财政周,并可以返回。

更新:

下面是我所拥有的,它在我的测试中起作用:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30876667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档