一系列工作日

时间:2014-09-30 12:09:28

标签: vba

我正在寻找一种方法来存储每个月的两个“输入日期”之间的最后一个工作日,我需要将它们存储为数组中的字符串。我试图使用工作表函数“工作日”,但我的输入日期格式为dd-mm-yyy,我不能让它工作..

感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

太糟糕了,我认为你的VB.NET标签是正确的,现在它被删除了。但是,如果有人在.NET中需要类似的东西,这可能会有所帮助:

Dim fromDate = DateTime.Today.AddYears(-1)  ' sample days
Dim toDate = DateTime.Today
Dim startDay = New Date(fromDate.Year, fromDate.Month, 1).AddMonths(1)
Dim endDay = New Date(toDate.Year, toDate.Month, 1).AddMonths(1)
Dim monthsBetween As Int32 = GetMonthsBetween(startDay, endDay)
Dim nonWorkingDays = {DayOfWeek.Saturday, DayOfWeek.Sunday}
Dim workingDatesBetween As New List(Of String)
For month As Int32 = 0 To monthsBetween
    Dim d As DateTime = startDay.AddMonths(month)
    ' look into last months last days, shorter way
    Dim lastWorkingDay As Date = Date.MinValue
    While lastWorkingDay = Date.MinValue
        d = d.AddDays(-1)  ' look backwards into the last month to find the last working-day
        If Not nonWorkingDays.Contains(d.DayOfWeek) Then
            lastWorkingDay = d
            workingDatesBetween.Add(lastWorkingDay.ToString("dd-MM-yyy", CultureInfo.InvariantCulture))
        End If
    End While
Next
Dim result = workingDatesBetween.ToArray()

此方法用于确定两个日期之间的月数:

Public Shared Function GetMonthsBetween(date1 As DateTime, date2 As DateTime) As Int32
    Dim months = Math.Abs(((date1.Year - date2.Year) * 12) + date1.Month - date2.Month)
    Return months
End Function

或作为可重复使用的方法(虽然我怀疑有人经常需要这种方法):

Public Shared Function GetLastWorkingDatesInMonthBetween(fromDate As Date, toDate As Date) As Date()
    Dim startDay = New Date(fromDate.Year, fromDate.Month, 1).AddMonths(1)
    Dim endDay = New Date(toDate.Year, toDate.Month, 1).AddMonths(1)
    Dim monthsBetween As Int32 = GetMonthsBetween(startDay, endDay)
    Dim nonWorkingDays = {DayOfWeek.Saturday, DayOfWeek.Sunday}
    Dim workingDatesBetween As New List(Of Date)
    For month As Int32 = 0 To monthsBetween
        Dim d As DateTime = startDay.AddMonths(month)
        ' look into last months last days, shorter way
        Dim lastWorkingDay As Date = Date.MinValue
        While lastWorkingDay = Date.MinValue
            d = d.AddDays(-1)  ' look backwards into the last month to find the last working-day
            If Not nonWorkingDays.Contains(d.DayOfWeek) Then
                lastWorkingDay = d
                workingDatesBetween.Add(d)
            End If
        End While
    Next
    Return workingDatesBetween.ToArray()
End Function

现在,您从String()通过Date()获得Array.ConvertAll

Dim allNonWorkingDates = GetLastWorkingDatesInMonthBetween(DateTime.Today.AddYears(-1), DateTime.Today)
Dim result As String() = Array.ConvertAll(allNonWorkingDates, Function(d) d.ToString("dd-MM-yyy", CultureInfo.InvariantCulture))

上述样本年度的结果:

30-09-2013
31-10-2013
29-11-2013
31-12-2013
31-01-2014
28-02-2014
31-03-2014
30-04-2014
30-05-2014
30-06-2014
31-07-2014
29-08-2014
30-09-2014