Imports GrapeCity.Win.Editors
Dim nationalHoliday As HolidayStyle = New HolidayStyle()
Dim normalday As HolidayStyle = New HolidayStyle()
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
SetNationalHoliday()
AddHandler GcDateTime1.DropDownCalendar.Scrolled, AddressOf DropDownCalendar_Scrolled
End Sub
Private Sub SetNationalHoliday()
' 2019年4月現在の国民の祝日を設定します。
' 固定の祝日を設定します。
nationalHoliday.Name = "国民の祝日"
nationalHoliday.SubStyle = New SubStyle(Color.Pink, Color.White)
nationalHoliday.Holidays.Add(New Holiday("元日", 1, 1))
nationalHoliday.Holidays.Add(New DayOfWeekHoliday("成人の日", MonthFlags.January, DayOfWeekInMonthFlags.Second, DayOfWeekFlags.Monday))
nationalHoliday.Holidays.Add(New Holiday("建国記念の日", 2, 11))
nationalHoliday.Holidays.Add(New Holiday("昭和の日", 4, 29))
nationalHoliday.Holidays.Add(New Holiday("憲法記念日", 5, 3))
nationalHoliday.Holidays.Add(New Holiday("みどりの日", 5, 4))
nationalHoliday.Holidays.Add(New Holiday("こどもの日", 5, 5))
nationalHoliday.Holidays.Add(New DayOfWeekHoliday("海の日", MonthFlags.July, DayOfWeekInMonthFlags.Third, DayOfWeekFlags.Monday))
nationalHoliday.Holidays.Add(New DayOfWeekHoliday("敬老の日", MonthFlags.September, DayOfWeekInMonthFlags.Third, DayOfWeekFlags.Monday))
nationalHoliday.Holidays.Add(New DayOfWeekHoliday("体育の日", MonthFlags.October, DayOfWeekInMonthFlags.Second, DayOfWeekFlags.Monday))
nationalHoliday.Holidays.Add(New Holiday("文化の日", 11, 3))
nationalHoliday.Holidays.Add(New Holiday("勤労感謝の日", 11, 23))
' 天皇即位にともなう祝日を設定します。
nationalHoliday.Holidays.Add(New ForceHoliday("休日", DateTime.Parse("2019/4/30"), DateTime.Parse("2019/5/2")))
nationalHoliday.Holidays.Add(New ForceHoliday("休日", DateTime.Parse("2019/10/22")))
' 2020年の東京オリンピック・東京パラリンピックにともなう祝日を設定します。
nationalHoliday.Holidays.Add(New ForceHoliday("海の日", DateTime.Parse("2020/7/23")))
nationalHoliday.Holidays.Add(New ForceHoliday("スポーツの日", DateTime.Parse("2020/7/24")))
nationalHoliday.Holidays.Add(New ForceHoliday("山の日", DateTime.Parse("2020/8/10")))
' 2020年の「7月20日」「10月12日」を通常日に設定します。
normalday.Name = "通常日"
normalday.Holidays.Add(New ForceWorkday("", DateTime.Parse("2020/7/20")))
normalday.Holidays.Add(New ForceWorkday("", DateTime.Parse("2020/10/12")))
'normalday.Holidays.Add(New ForceDayOfWeekWorkday(2020, MonthFlags.July, DayOfWeekInMonthFlags.Third, DayOfWeekFlags.Monday))
'normalday.Holidays.Add(New ForceDayOfWeekWorkday(2020, MonthFlags.October, DayOfWeekInMonthFlags.Second, DayOfWeekFlags.Monday))
' 振替休日の扱いを設定します。
nationalHoliday.Holidays.Weekdays.Sunday = New DayOfWeekHolidayPolicy(WeekFlags.All, HolidayOverride.NextWorkDay)
GcDateTime1.DropDownCalendar.OverrideTipText = "振替休日"
' 休日スタイルをコレクションに追加してカレンダーに反映させます。
GcDateTime1.DropDownCalendar.HolidayStyles.Add("国民の祝日", nationalHoliday)
GcDateTime1.DropDownCalendar.HolidayStyles.Add("通常日", normalday)
GcDateTime1.DropDownCalendar.ActiveHolidayStyles = New String() {"国民の祝日", "通常日"}
End Sub
Private Sub DropDownCalendar_Scrolled(ByVal sender As Object, ByVal e As GrapeCity.Win.Editors.ScrolledEventArgs)
' 年によって変化する国民の祝日(春分の日、秋分の日)を設定します。
Dim currentYear As Integer = e.StartDate.Year
' 春分の日と秋分の日の初期値として2019年の祝日を設定します。
Dim syunbun As DateTime = DateTime.Parse(currentYear.ToString() + "/3/21")
Dim syubun As DateTime = DateTime.Parse(currentYear.ToString() + "/9/23")
' 1900年から2099年までを対象にしています。
' この範囲を超えた年については、便宜的に
' 2015年の設定をそのまま使用します。
If currentYear > 1899 AndAlso currentYear < 2100 Then
Select Case currentYear Mod 4
Case 0
' 春分の日を設定します。
If currentYear < 1960 Then
syunbun = DateTime.Parse(currentYear.ToString() + "/3/21")
ElseIf currentYear >= 1960 AndAlso currentYear < 2092 Then
syunbun = DateTime.Parse(currentYear.ToString() + "/3/20")
Else
syunbun = DateTime.Parse(currentYear.ToString() + "/3/19")
End If
' 秋分の日を設定します。
If currentYear < 2012 Then
syubun = DateTime.Parse(currentYear.ToString() + "/9/23")
Else
syubun = DateTime.Parse(currentYear.ToString() + "/9/22")
End If
Case 1
' 春分の日を設定します。
If currentYear < 1993 Then
syunbun = DateTime.Parse(currentYear.ToString() + "/3/21")
Else
syunbun = DateTime.Parse(currentYear.ToString() + "/3/20")
End If
' 秋分の日を設定します。
If currentYear < 1921 Then
syubun = DateTime.Parse(currentYear.ToString() + "/9/24")
ElseIf currentYear >= 1921 AndAlso currentYear < 2045 Then
syubun = DateTime.Parse(currentYear.ToString() + "/9/23")
Else
syubun = DateTime.Parse(currentYear.ToString() + "/9/22")
End If
Case 2
' 春分の日を設定します。
If currentYear < 2026 Then
syunbun = DateTime.Parse(currentYear.ToString() + "/3/21")
Else
syunbun = DateTime.Parse(currentYear.ToString() + "/3/20")
End If
' 秋分の日を設定します。
If currentYear < 1950 Then
syubun = DateTime.Parse(currentYear.ToString() + "/9/24")
ElseIf currentYear >= 1950 AndAlso currentYear < 2078 Then
syubun = DateTime.Parse(currentYear.ToString() + "/9/23")
Else
syubun = DateTime.Parse(currentYear.ToString() + "/9/22")
End If
Case 3
' 春分の日を設定します。
If (currentYear < 1927) Then
syunbun = DateTime.Parse(currentYear.ToString() + "/3/22")
ElseIf currentYear >= 1927 AndAlso currentYear < 2059 Then
syunbun = DateTime.Parse(currentYear.ToString() + "/3/21")
Else
syunbun = DateTime.Parse(currentYear.ToString() + "/3/20")
End If
' 秋分の日を設定します。
If currentYear < 1983 Then
syubun = DateTime.Parse(currentYear.ToString() + "/9/24")
Else
syubun = DateTime.Parse(currentYear.ToString() + "/9/23")
End If
End Select
' 春分の日を設定します。
If (Not isHoliday(syunbun)) Then nationalHoliday.Holidays.Add(New ForceHoliday("春分の日", syunbun))
' 秋分の日を設定します。
If (Not isHoliday(syubun)) Then nationalHoliday.Holidays.Add(New ForceHoliday("秋分の日", syubun))
' 2つの祝日に挟まれた営業日を休日に設定します。
If currentYear > 2003 Then
If syubun.DayOfWeek = System.DayOfWeek.Wednesday Then
nationalHoliday.Holidays.Add(New ForceHoliday("休日", syubun.AddDays(-1)))
End If
End If
' 2016年以降、山の日を設定します。
If currentYear > 2015 AndAlso currentYear <> 2020 Then
If (Not isHoliday(DateTime.Parse(currentYear.ToString() + "/8/11"))) Then nationalHoliday.Holidays.Add(New ForceHoliday("山の日", DateTime.Parse(currentYear.ToString() + "/8/11")))
End If
' 天皇誕生日を設定します。
If currentYear > 2019 Then
If (Not isHoliday(DateTime.Parse(currentYear.ToString() + "/2/23"))) Then nationalHoliday.Holidays.Add(New ForceHoliday("天皇誕生日", DateTime.Parse(currentYear.ToString() + "/2/23")))
End If
If currentYear < 2019 AndAlso currentYear > 1988 Then
If (Not isHoliday(DateTime.Parse(currentYear.ToString() + "/12/23"))) Then nationalHoliday.Holidays.Add(New ForceHoliday("天皇誕生日", DateTime.Parse(currentYear.ToString() + "/12/23")))
End If
End If
End Sub
Private Function isHoliday(ByVal dt As DateTime) As Boolean
' すでに休日としてコレクションに登録されているかどうかをチェックします。
Dim obj As Object = Nothing
Dim t As DayType = nationalHoliday.Holidays.GetTypeOfDay(dt, obj)
If (t <> DayType.Holiday AndAlso t <> DayType.ForcedHoliday) Then
Return False
End If
Return True
End Function
using GrapeCity.Win.Editors;
HolidayStyle nationalHoliday = new HolidayStyle();
HolidayStyle normalday = new HolidayStyle();
private void Form1_Load(object sender, EventArgs e)
{
SetNationalHoliday();
gcDateTime1.DropDownCalendar.Scrolled += DropDownCalendar_Scrolled;
}
private void SetNationalHoliday()
{
// 2019年4月現在の国民の祝日を設定します。
// 固定の祝日を設定します。
nationalHoliday.Name = "国民の祝日";
nationalHoliday.SubStyle = new SubStyle(Color.LightPink, Color.Red);
nationalHoliday.Holidays.Add(new Holiday("元旦", 1, 1));
nationalHoliday.Holidays.Add(new DayOfWeekHoliday("成人の日", MonthFlags.January, DayOfWeekInMonthFlags.Second, DayOfWeekFlags.Monday));
nationalHoliday.Holidays.Add(new Holiday("建国記念の日", 2, 11));
nationalHoliday.Holidays.Add(new Holiday("昭和の日", 4, 29));
nationalHoliday.Holidays.Add(new Holiday("憲法記念日", 5, 3));
nationalHoliday.Holidays.Add(new Holiday("みどりの日", 5, 4));
nationalHoliday.Holidays.Add(new Holiday("こどもの日", 5, 5));
nationalHoliday.Holidays.Add(new DayOfWeekHoliday("海の日", MonthFlags.July, DayOfWeekInMonthFlags.Third, DayOfWeekFlags.Monday));
nationalHoliday.Holidays.Add(new DayOfWeekHoliday("敬老の日", MonthFlags.September, DayOfWeekInMonthFlags.Third, DayOfWeekFlags.Monday));
nationalHoliday.Holidays.Add(new DayOfWeekHoliday("体育の日", MonthFlags.October, DayOfWeekInMonthFlags.Second, DayOfWeekFlags.Monday));
nationalHoliday.Holidays.Add(new Holiday("文化の日", 11, 3));
nationalHoliday.Holidays.Add(new Holiday("勤労感謝の日", 11, 23));
// 天皇即位にともなう祝日を設定します。
nationalHoliday.Holidays.Add(new ForceHoliday("休日", DateTime.Parse("2019/4/30"), DateTime.Parse("2019/5/2")));
nationalHoliday.Holidays.Add(new ForceHoliday("休日", DateTime.Parse("2019/10/22")));
// 2020年の東京オリンピック・東京パラリンピックにともなう祝日を設定します。
nationalHoliday.Holidays.Add(new ForceHoliday("海の日", DateTime.Parse("2020/7/23")));
nationalHoliday.Holidays.Add(new ForceHoliday("スポーツの日", DateTime.Parse("2020/7/24")));
nationalHoliday.Holidays.Add(new ForceHoliday("山の日", DateTime.Parse("2020/8/10")));
// 2020年の「7月20日」「10月12日」を通常日に設定します。
normalday.Name = "通常日";
normalday.Holidays.Add(new ForceWorkday("", DateTime.Parse("2020/7/20")));
normalday.Holidays.Add(new ForceWorkday("", DateTime.Parse("2020/10/12")));
//normalday.Holidays.Add(new ForceDayOfWeekWorkday(2020, MonthFlags.July, DayOfWeekInMonthFlags.Third, DayOfWeekFlags.Monday));
//normalday.Holidays.Add(new ForceDayOfWeekWorkday(2020, MonthFlags.October, DayOfWeekInMonthFlags.Second, DayOfWeekFlags.Monday));
//年によって変化する祝日の初期値(2019年)を設定します。
nationalHoliday.Holidays.Add(new ForceHoliday("春分の日", DateTime.Parse("2019/3/21")));
nationalHoliday.Holidays.Add(new ForceHoliday("秋分の日", DateTime.Parse("2019/9/23")));
// 振替休日の扱いを設定します。
nationalHoliday.Holidays.Weekdays.Sunday = new DayOfWeekHolidayPolicy(WeekFlags.All, HolidayOverride.NextWorkDay);
gcDateTime1.DropDownCalendar.OverrideTipText = "振替休日";
// 休日スタイルをコレクションに追加してカレンダーに反映させます。
gcDateTime1.DropDownCalendar.HolidayStyles.Add("国民の祝日", nationalHoliday);
gcDateTime1.DropDownCalendar.HolidayStyles.Add("通常日", normalday);
gcDateTime1.DropDownCalendar.ActiveHolidayStyles = new string[] { "国民の祝日", "通常日" };
gcDateTime1.DropDownCalendar.EnableScrollAnimation = false;
}
private void DropDownCalendar_Scrolled(object sender, GrapeCity.Win.Editors.ScrolledEventArgs e)
{
// 年によって変化する国民の祝日を設定します。
int currentYear = e.StartDate.Year;
// 春分の日と秋分の日の初期値として2019年の祝日を設定します。
DateTime syunbun = DateTime.Parse(currentYear.ToString() + "/3/21");
DateTime syubun = DateTime.Parse(currentYear.ToString() + "/9/23");
// 1900年から2099年までを対象にしています。
// この範囲を超えた年については、便宜的に
// 2019年の春分の日、秋分の日の設定をそのまま使用します。
if (currentYear > 1899 && currentYear < 2100)
{
switch (currentYear % 4)
{
case 0:
// 春分の日を設定します。
if (currentYear < 1960)
{
syunbun = DateTime.Parse(currentYear.ToString() + "/3/21");
}
else if (currentYear >= 1960 && currentYear < 2092)
{
syunbun = DateTime.Parse(currentYear.ToString() + "/3/20");
}
else
{
syunbun = DateTime.Parse(currentYear.ToString() + "/3/19");
}
// 秋分の日を設定します。
if (currentYear < 2012)
{
syubun = DateTime.Parse(currentYear.ToString() + "/9/23");
}
else
{
syubun = DateTime.Parse(currentYear.ToString() + "/9/22");
}
break;
case 1:
// 春分の日を設定します。
if (currentYear < 1993)
{
syunbun = DateTime.Parse(currentYear.ToString() + "/3/21");
}
else
{
syunbun = DateTime.Parse(currentYear.ToString() + "/3/20");
}
// 秋分の日を設定します。
if (currentYear < 1921)
{
syubun = DateTime.Parse(currentYear.ToString() + "/9/24");
}
else if (currentYear >= 1921 && currentYear < 2045)
{
syubun = DateTime.Parse(currentYear.ToString() + "/9/23");
}
else
{
syubun = DateTime.Parse(currentYear.ToString() + "/9/22");
}
break;
case 2:
// 春分の日を設定します。
if (currentYear < 2026)
{
syunbun = DateTime.Parse(currentYear.ToString() + "/3/21");
}
else
{
syunbun = DateTime.Parse(currentYear.ToString() + "/3/20");
}
// 秋分の日を設定します。
if (currentYear < 1950)
{
syubun = DateTime.Parse(currentYear.ToString() + "/9/24");
}
else if (currentYear >= 1950 && currentYear < 2078)
{
syubun = DateTime.Parse(currentYear.ToString() + "/9/23");
}
else
{
syubun = DateTime.Parse(currentYear.ToString() + "/9/22");
}
break;
case 3:
// 春分の日を設定します。
if (currentYear < 1927)
{
syunbun = DateTime.Parse(currentYear.ToString() + "/3/22");
}
else if (currentYear >= 1927 && currentYear < 2059)
{
syunbun = DateTime.Parse(currentYear.ToString() + "/3/21");
}
else
{
syunbun = DateTime.Parse(currentYear.ToString() + "/3/20");
}
// 秋分の日を設定します。
if (currentYear < 1983)
{
syubun = DateTime.Parse(currentYear.ToString() + "/9/24");
}
else
{
syubun = DateTime.Parse(currentYear.ToString() + "/9/23");
}
break;
}
}
// 春分の日を設定します。
if (!isHoliday(syunbun)) nationalHoliday.Holidays.Add(new ForceHoliday("春分の日", syunbun));
// 秋分の日を設定します。
if (!isHoliday(syubun)) nationalHoliday.Holidays.Add(new ForceHoliday("秋分の日", syubun));
// 2つの祝日に挟まれた営業日を休日に設定します。
if (currentYear > 2003)
{
if (syubun.DayOfWeek == System.DayOfWeek.Wednesday)
{
if (!isHoliday(syubun.AddDays(-1))) nationalHoliday.Holidays.Add(new ForceHoliday("休日", syubun.AddDays(-1)));
}
}
// 2016年以降、山の日を設定します。
if (currentYear > 2015 && currentYear != 2020)
{
if (!isHoliday(DateTime.Parse(currentYear.ToString() + "/8/11"))) nationalHoliday.Holidays.Add(new ForceHoliday("山の日", DateTime.Parse(currentYear.ToString() + "/8/11")));
}
// 天皇誕生日を設定します。
if (currentYear > 2019)
{
if (!isHoliday(DateTime.Parse(currentYear.ToString() + "/2/23"))) nationalHoliday.Holidays.Add(new ForceHoliday("天皇誕生日", DateTime.Parse(currentYear.ToString() + "/2/23")));
}
if (currentYear < 2019 && currentYear > 1988)
{
if (!isHoliday(DateTime.Parse(currentYear.ToString() + "/12/23"))) nationalHoliday.Holidays.Add(new ForceHoliday("天皇誕生日", DateTime.Parse(currentYear.ToString() + "/12/23")));
}
}
private bool isHoliday(DateTime dt)
{
// すでに休日としてコレクションに登録されているかどうかをチェックします。
object obj;
DayType type = nationalHoliday.Holidays.GetTypeOfDay(dt, out obj);
if (type != DayType.Holiday && type != DayType.ForcedHoliday)
{
return false;
}
return true;
}