週末を除く、次の 2 つの連続する営業日 (米国の営業日) が休日であるかどうかを判断する必要があります。
これを解決するための私の努力:
todayVariable = Date.Now()
この変数の日付部分を取得して、1 または 7 の場合は週末であることを意味するので、そのままにしておきます。しかし、私が知らないのは、平日が休日ではないかどうかを判断する方法です。たとえば、今後 2 年間のすべての公休日のリストを取得するにはどうすればよいでしょうか。
明日が休日の場合は、次のように答えてください。
Dim todayVariable As Date = Today
Debug.Print(isHoliday(todayVariable.AddDays(1)))
Function isHoliday(ByVal dt As Date)
Return getHolidayList(dt.Year).Any(Function(x) x = dt)
End Function
以下のコードは、米国連邦の祝日の日付を計算します。この方法の弱点は、ルールがハードコードされているため、まれに議会がルールを変更した場合にコードを変更する必要があることです。私の社内ソフトウェアでは問題ありませんが、他のソフトウェアでは問題になる可能性があります。
また、イースターは米国連邦の祝日ではないため、計算しません。Nature (1876) 復活祭の日付を計算するためのアルゴリズムを参照
Public Function getHolidayList(ByVal vYear As Integer) As List(Of Date)
Dim FirstWeek As Integer = 1
Dim SecondWeek As Integer = 2
Dim ThirdWeek As Integer = 3
Dim FourthWeek As Integer = 4
Dim LastWeek As Integer = 5
Dim HolidayList As New List(Of Date)
' http://www.usa.gov/citizens/holidays.shtml
' http://archive.opm.gov/operating_status_schedules/fedhol/2013.asp
' New Year's Day Jan 1
HolidayList.Add(DateSerial(vYear, 1, 1))
' Martin Luther King, Jr. third Mon in Jan
HolidayList.Add(GetNthDayOfNthWeek(DateSerial(vYear, 1, 1), DayOfWeek.Monday, ThirdWeek))
' Washington's Birthday third Mon in Feb
HolidayList.Add(GetNthDayOfNthWeek(DateSerial(vYear, 2, 1), DayOfWeek.Monday, ThirdWeek))
' Memorial Day last Mon in May
HolidayList.Add(GetNthDayOfNthWeek(DateSerial(vYear, 5, 1), DayOfWeek.Monday, LastWeek))
' Independence Day July 4
HolidayList.Add(DateSerial(vYear, 7, 4))
' Labor Day first Mon in Sept
HolidayList.Add(GetNthDayOfNthWeek(DateSerial(vYear, 9, 1), DayOfWeek.Monday, FirstWeek))
' Columbus Day second Mon in Oct
HolidayList.Add(GetNthDayOfNthWeek(DateSerial(vYear, 10, 1), DayOfWeek.Monday, SecondWeek))
' Veterans Day Nov 11
HolidayList.Add(DateSerial(vYear, 11, 11))
' Thanksgiving Day fourth Thur in Nov
HolidayList.Add(GetNthDayOfNthWeek(DateSerial(vYear, 11, 1), DayOfWeek.Thursday, FourthWeek))
' Christmas Day Dec 25
HolidayList.Add(DateSerial(vYear, 12, 25))
'saturday holidays are moved to Fri; Sun to Mon
For i As Integer = 0 To HolidayList.Count - 1
Dim dt As Date = HolidayList(i)
If dt.DayOfWeek = DayOfWeek.Saturday Then
HolidayList(i) = dt.AddDays(-1)
End If
If dt.DayOfWeek = DayOfWeek.Sunday Then
HolidayList(i) = dt.AddDays(1)
End If
Next
'return
Return HolidayList
End Function
Private Function GetNthDayOfNthWeek(ByVal dt As Date, ByVal DayofWeek As Integer, ByVal WhichWeek As Integer) As Date
'specify which day of which week of a month and this function will get the date
'this function uses the month and year of the date provided
'get first day of the given date
Dim dtFirst As Date = DateSerial(dt.Year, dt.Month, 1)
'get first DayOfWeek of the month
Dim dtRet As Date = dtFirst.AddDays(6 - dtFirst.AddDays(-(DayofWeek + 1)).DayOfWeek)
'get which week
dtRet = dtRet.AddDays((WhichWeek - 1) * 7)
'if day is past end of month then adjust backwards a week
If dtRet >= dtFirst.AddMonths(1) Then
dtRet = dtRet.AddDays(-7)
End If
'return
Return dtRet
End Function
米国の公式の休日の一般的に合意されたリストはありません。おそらく最も近いのは連邦祝日カレンダーですが、これには、ワシントンの誕生日やコロンブスデーなど、ほとんどの企業が営業している日が含まれます。
多くの企業は、休日をデータベーステーブルに入れるか、カレンダーテーブルにまとめることを選択します。
他の人がすでに指摘しているように、「計算」または単に「どこかに行く」ことができる休日のリストはないようです。該当する日付のリストをハードコーディングする必要があります。
他の問題を回避するのに役立つ、説明に関するいくつかのコメント:
Date.Now は、日付と「今」の時刻を返します。時間を考慮せずに日付を比較したい場合は、Date.Today を使用できます。
dateValue.DatePart は、確かに日付部分 (年、月、日) を提供します。おそらく、曜日 (日曜日、月曜日、...) を知りたいと思うでしょう。これは次のようになります。
Dim dayValue As System.DayOfWeek = dateValue.DayOfWeek
結果は、Sunday(=0)、Monday(=1) などの値を持つ整数 Enum です。
混乱を避けるために: dateValue (dateValue.Day) の Day プロパティは、1 か月の日数 (1..31) を示します。