如果该月的第一天是星期一至星期三,则第一个星期一是本周。
如果第一天是周四至周日,则第一个周一为下周一。
示例:
2021 年 8 月 - 第一个星期一为 02/08/2021,因为该月的第一天是星期日(即星期三之后)。
2021 年 9 月 - 第一个星期一为 30/08/2021,因为该月的第一天是星期三。
2021 年 10 月 - 第一个星期一为 04/10/2021,因为该月的第一天是星期五。
以下代码给出该月的第一个星期一。
Public Function FirstMonday(myDate As Date) As Date
Dim d As Date, w As Long
d = DateSerial(Year(myDate), month(myDate), 1)
w = Weekday(d, vbMonday)
FirstMonday = d + IIf(w <> 1, 8 - w, 0)
End Function
为了分解你的问题,你真正要寻找的是该月第一个星期三之前的星期一。
所以,只要找到第一个星期三,然后减去两天!!不需要使用
If ... Else
语句使事情变得过于复杂。
Public Function FirstMonday(myDate As Date) As Date
Dim d As Date, w As Long
d = DateSerial(Year(myDate), Month(myDate), 1)
w = Weekday(d, vbThursday) 'Thursday = 1, Friday = 2, Wednesday = 7
d = d + 7 - w 'Adjusts d from being first day to first wednesday
FirstMonday = d - 2 'The Monday before
End Function
你很接近。对于您的测试日期,这给了我预期的回应:
Public Function FirstMonday(myDate As Date) As Date
Dim d As Date, w As Long
d = DateSerial(Year(myDate), Month(myDate), 1)
w = Weekday(d, vbMonday)
If w > 3 Then
FirstMonday = d + (8 - w)
Else
FirstMonday = d - w + 1
End If
End Function
w > 3
时,每月的第一天是周四到周日。在这种情况下,请将缺少的天数添加到下周一 (8 - w
)。否则,向后退并减去 w - 1
即可到达前一周的星期一。
尝试一下这个版本:
Public Function FirstMonday(myDate As Date) As Date
Dim d As Date, w As Long
d = DateSerial(Year(myDate), Month(myDate), 1)
w = Weekday(d, vbMonday)
If w >= 1 And w <= 3 Then d = d - 7
FirstMonday = d + 8 - w
End Function
d
将保存该月第一天的日期w
将获取该日期是星期几(星期一=1,星期日=7)w
是 1..3)时,我们返回一周 (d = d - 7
)。d + 8 - w
)。
这是结果:
月 | 月初 | 第一个星期一 |
---|---|---|
一月 | 2021 年 1 月 1 日星期五 | 2021 年 1 月 4 日星期一 |
二月 | 2021 年 2 月 1 日星期一 | 2021 年 2 月 1 日星期一 |
三月 | 2021 年 3 月 1 日星期一 | 2021 年 3 月 1 日星期一 |
四月 | 2021 年 4 月 1 日,星期四 | 2021 年 4 月 5 日星期一 |
五月 | 2021 年 5 月 1 日,星期六 | 2021 年 5 月 3 日星期一 |
六月 | 2021 年 6 月 1 日星期二 | 2021 年 5 月 31 日星期一 |
七月 | 2021 年 7 月 1 日,星期四 | 2021 年 7 月 5 日星期一 |
八月 | 2021 年 8 月 1 日,星期日 | 2021 年 8 月 2 日星期一 |
九月 | 2021 年 9 月 1 日,星期三 | 2021 年 8 月 30 日星期一 |
十月 | 2021 年 10 月 1 日星期五 | 2021 年 10 月 4 日星期一 |
十一月 | 2021 年 11 月 1 日星期一 | 2021 年 11 月 1 日星期一 |
十二月 | 2021 年 12 月 1 日,星期三 | 2021 年 11 月 29 日星期一 |
我没有发现最后一个例子适用于所有日期。这是适用于所有日期的调整版本:
Public Function FirstMonday(myDate As Date)
Dim d As Date, w As Long
d = DateSerial(Year(myDate), Month(myDate), 1)
w = Weekday(d) ' Monday = 2
Do Until w = 2
d = d + 1
w = Weekday(d)
Loop
' now have first Monday for d
FirstMonday = d
End Function