检查今天是否是每月的第一个工作日



我想检查当前日期是否是该月的第一个工作日,我想知道是否有更简单的方法可以做到这一点? 目前,我使用以下编码来确定第一个工作日,然后将其与另一个具有今天日期的文本框匹配。

 Private Sub Button1_Click_1(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim Dte As Date = FirstMonday(1, 2015)
        Me.TextBox1.Text = Dte.ToString
    End Sub
   Private Function FirstMonday(ByVal Mnth As Integer, ByVal year As Integer) As Date
        Dim Dte As Date = New Date(year, Mnth, 1)
        Do While Dte.DayOfWeek <> DayOfWeek.Monday
            Dte = Dte.AddDays(1)
        Loop
        Return Dte
    End Function
在这里,

您有一个返回每月第一个星期一的函数,另一个函数验证给定日期是否是本周一,最后是一个执行此验证但与今天一起的函数。

private static DateTime FirstMonday(int month, int year)
{
    DateTime date = new DateTime(year, month, 1);
    int daysToAdd = 8 - (int)date.DayOfWeek;
    if (daysToAdd >= 7)
        daysToAdd -= 7;
    return date.AddDays(daysToAdd);
}
private static bool IsFirstMondayOfMonth(DateTime date)
{
    if (date.DayOfWeek != DayOfWeek.Monday || date.Day > 7)
        return false;
    return true;
}
private static bool IsTodayFirstMondayOfMonth()
{
    if (DateTime.Today.DayOfWeek != DayOfWeek.Monday || DateTime.Today.Day > 7)
        return false;
    return true;
}

它们是 C# 格式的,但我相信您可以轻松地将它们转换为 VB。

最后,关于您在评论中的请求,您可以简单地使用 date.ToShortDateString() 来获取 dd/MM/yyyy 格式(如果这是您配置的区域性)。如果要确保在所有情况下都使用该格式,请改用date.ToString("dd/MM/yyyy")

你可以试试这个函数

Public Function FirstMonday(year As Integer, month As Integer) As DateTime
    Dim firstDay As New DateTime(year, month, 1)
    If firstDay.DayOfWeek = DayOfWeek.Monday Then
        Return firstDay
    Else
        Dim days = DayOfWeek.Monday - firstDay.DayOfWeek ' in case the first day was less than monday
        If firstDay.DayOfWeek > DayOfWeek.Monday Then days = 7 - firstDay.DayOfWeek + DayOfWeek.Monday ' in case if the first day was > monday              
        Return firstDay.AddDays(days)
    End If
End Function

使用此功能

dim monday=FirstMonday(2014,6) ' for example

如果要泛化函数以与任何星期几一起使用,则可以使用以下函数

Public Function FirstDayOfWeek(year As Integer, month As Integer, Day As DayOfWeek) As DateTime
    Dim firstDay As New DateTime(year, month, 1)
    If firstDay.DayOfWeek = Day Then
        Return firstDay
    Else
        Dim days = Day - firstDay.DayOfWeek ' in case the first day was less than DayOfWeek
        If firstDay.DayOfWeek > Day Then days = 7 - firstDay.DayOfWeek + Day ' in case if the first day was > DayOfWeek             
        Return firstDay.AddDays(days)
    End If
End Function

这是一个工作演示

演示的结果是:哪个是准确的

First Monday in [Jan 2014] is 06 Jan 2014
First Monday in [Feb 2014] is 03 Feb 2014
First Monday in [Mar 2014] is 03 Mar 2014
First Monday in [Apr 2014] is 07 Apr 2014
First Monday in [May 2014] is 05 May 2014
First Monday in [Jun 2014] is 02 Jun 2014
First Monday in [Jul 2014] is 07 Jul 2014
First Monday in [Aug 2014] is 04 Aug 2014
First Monday in [Sep 2014] is 01 Sep 2014
First Monday in [Oct 2014] is 06 Oct 2014
First Monday in [Nov 2014] is 03 Nov 2014
First Monday in [Dec 2014] is 01 Dec 2014

我想检查当前日期是否是该月的第一个工作日

很好,但是第一个星期一与此有什么关系?如果月份从星期五开始怎么办?还是星期二?那么第一个星期一就是错误的结果。

我发现最简单的方法是从月初开始,向前倒数,直到找到一个工作日:

Private Shared Function FirstWeekDayOfCurrentMonth() As DateTime
    'we check DateTime.Today twice in this function
    'so save first result to avoid race condition near midnight
    Dim current As DateTime = Date.Today 
    current = current.AddDays(-1 * (current.Day - 1) )      
    While current.DayOfWeek = DayOfWeek.Sunday OrElse current.DayOfWeek = DayOfWeek.Saturday
       current = current.AddDays(1)
    End While
    Return current 
End Function

我知道有时需要为这样的东西编写一个循环感觉效率低下,但最多你会用这段代码进行两次迭代,所以它仍然很好。然后检查变得微不足道:

Private Shared Function IsFirstWeekDayOfCurrentMonth() As Boolean
     Return DateTime.Today.Equals( FirstWeekDayOfCurrentMonth() )
End Function

请注意,在第一个函数中,我保存了 DateTime.Today 值的副本,以避免在系统时钟的午夜运行时出现奇怪结果的可能性。实际上,您也应该跨函数执行此操作,因此更好的程序设计将像这样工作:

Private Shared Function FirstWeekDayOfMonth(DateTime month) As DateTime
    'remove any time component and set to first day of the month
    month = month.Date.AddDays(-1 * (current.Day - 1) ) 
    While month.DayOfWeek = DayOfWeek.Sunday OrElse month.DayOfWeek = DayOfWeek.Saturday
       month = month.AddDays(1)
    End While
    Return month
End Function
Private Shared Function IsFirstWeekDayOfMonth(DateTime dateToCheck ) As Boolean
     Return dateToCheck.Date.Equals( FirstWeekDayOfMonth(dateToCheck) )
End Function

然后你会这样称呼它:

If IsFirstWeekDayOfMonth(DateTime.Today) Then
    '...
End IF

最新更新