获取上周一的日期
Get Date of Previous Monday
我正在尝试获取本周星期一的日期。这接近正确吗?
Dim MondayOfCurrentWeek As Date = Date.Today - Date.Today.DayOfWeek + 1
据我了解,AyOfWeek 指数是:
1 = Monday
2 = Tuesday
3 = Wednesday
4 = Thursday
5 = Friday
6 = Saturday
0 = Sunday
因此,如果今天是星期四,我会得到:
Dim MondayOfCurrentWeek As Date = Date - 4 + 1
等于
Date - 3
在我看来是对的。
还是我完全不在了?
一种非常简单的替代方法,虽然可能性能不佳,但确实避免了任何基于算术的错误:
Dim monday As Date = Date.Today
While (monday.DayOfWeek <> DayOfWeek.Monday)
monday = monday.AddDays(-1)
End While
这可以很容易地扩展为一个函数来处理一周中的任何一天。除非这是一段非常大的代码,否则性能会很好。
这应该可以满足您的要求。它从提供的日期中查找前一个星期一。没有循环,所以会很快并且不依赖枚举值进行算术调整,所以如果枚举值发生变化也不会中断:
Public Shared Function PreviousMonday(ByVal dateValue As DateTime) As DateTime
Dim dayOffset As Integer
Select Case dateValue.DayOfWeek
Case DayOfWeek.Sunday : dayOffset = 6
Case DayOfWeek.Monday : dayOffset = 0
Case DayOfWeek.Tuesday : dayOffset = 1
Case DayOfWeek.Wednesday : dayOffset = 2
Case DayOfWeek.Thursday : dayOffset = 3
Case DayOfWeek.Friday : dayOffset = 4
Case DayOfWeek.Saturday : dayOffset = 5
End Select
Return dateValue.AddDays(-1 * dayOffset)
End Function
如果您正在寻找上周周一到周日的范围,那么您可以使用这些函数(来自 Matt Wilko 的答案的修改版本)来获取它们。
Public Shared Function PreviousMonday(ByVal dateValue As Date) As Date
Dim dayOffset As Integer
Select Case dateValue.DayOfWeek
Case DayOfWeek.Sunday : dayOffset = -13
Case DayOfWeek.Monday : dayOffset = -7
Case DayOfWeek.Tuesday : dayOffset = -8
Case DayOfWeek.Wednesday : dayOffset = -9
Case DayOfWeek.Thursday : dayOffset = -10
Case DayOfWeek.Friday : dayOffset = -11
Case DayOfWeek.Saturday : dayOffset = -12
End Select
Return dateValue.AddDays(dayOffset)
End Function
Public Shared Function PreviousSunday(ByVal dateValue As Date) As Date
Dim dayOffset As Integer
Select Case dateValue.DayOfWeek
Case DayOfWeek.Sunday : dayOffset = -7
Case DayOfWeek.Monday : dayOffset = -1
Case DayOfWeek.Tuesday : dayOffset = -2
Case DayOfWeek.Wednesday : dayOffset = -3
Case DayOfWeek.Thursday : dayOffset = -4
Case DayOfWeek.Friday : dayOffset = -5
Case DayOfWeek.Saturday : dayOffset = -6
End Select
Return dateValue.AddDays(dayOffset)
End Function
var now = DateTime.Now; //17.09.2020 19:15:49
int dayInWeek = (int)now.DayOfWeek; //4
var previousMonday = now.AddDays(-(((dayInWeek + 6) % 7) + 7)); //-10
var previousSunday= previousMonday.AddDays(6); //-4
Console.WriteLine(previousMonday); //07.09.2020 19:15:49
Console.WriteLine(previousSunday); //13.09.2020 19:15:49
Enumerable.Range(0,7).Select(Function(r) Date.Now.AddDays(-1*r).Date).
Where(Function(r) r.DayOfWeek = DayOfWeek.Monday).FirstOrDefault()
我正在尝试获取本周星期一的日期。这接近正确吗?
Dim MondayOfCurrentWeek As Date = Date.Today - Date.Today.DayOfWeek + 1
据我了解,AyOfWeek 指数是:
1 = Monday
2 = Tuesday
3 = Wednesday
4 = Thursday
5 = Friday
6 = Saturday
0 = Sunday
因此,如果今天是星期四,我会得到:
Dim MondayOfCurrentWeek As Date = Date - 4 + 1
等于
Date - 3
在我看来是对的。
还是我完全不在了?
一种非常简单的替代方法,虽然可能性能不佳,但确实避免了任何基于算术的错误:
Dim monday As Date = Date.Today
While (monday.DayOfWeek <> DayOfWeek.Monday)
monday = monday.AddDays(-1)
End While
这可以很容易地扩展为一个函数来处理一周中的任何一天。除非这是一段非常大的代码,否则性能会很好。
这应该可以满足您的要求。它从提供的日期中查找前一个星期一。没有循环,所以会很快并且不依赖枚举值进行算术调整,所以如果枚举值发生变化也不会中断:
Public Shared Function PreviousMonday(ByVal dateValue As DateTime) As DateTime
Dim dayOffset As Integer
Select Case dateValue.DayOfWeek
Case DayOfWeek.Sunday : dayOffset = 6
Case DayOfWeek.Monday : dayOffset = 0
Case DayOfWeek.Tuesday : dayOffset = 1
Case DayOfWeek.Wednesday : dayOffset = 2
Case DayOfWeek.Thursday : dayOffset = 3
Case DayOfWeek.Friday : dayOffset = 4
Case DayOfWeek.Saturday : dayOffset = 5
End Select
Return dateValue.AddDays(-1 * dayOffset)
End Function
如果您正在寻找上周周一到周日的范围,那么您可以使用这些函数(来自 Matt Wilko 的答案的修改版本)来获取它们。
Public Shared Function PreviousMonday(ByVal dateValue As Date) As Date
Dim dayOffset As Integer
Select Case dateValue.DayOfWeek
Case DayOfWeek.Sunday : dayOffset = -13
Case DayOfWeek.Monday : dayOffset = -7
Case DayOfWeek.Tuesday : dayOffset = -8
Case DayOfWeek.Wednesday : dayOffset = -9
Case DayOfWeek.Thursday : dayOffset = -10
Case DayOfWeek.Friday : dayOffset = -11
Case DayOfWeek.Saturday : dayOffset = -12
End Select
Return dateValue.AddDays(dayOffset)
End Function
Public Shared Function PreviousSunday(ByVal dateValue As Date) As Date
Dim dayOffset As Integer
Select Case dateValue.DayOfWeek
Case DayOfWeek.Sunday : dayOffset = -7
Case DayOfWeek.Monday : dayOffset = -1
Case DayOfWeek.Tuesday : dayOffset = -2
Case DayOfWeek.Wednesday : dayOffset = -3
Case DayOfWeek.Thursday : dayOffset = -4
Case DayOfWeek.Friday : dayOffset = -5
Case DayOfWeek.Saturday : dayOffset = -6
End Select
Return dateValue.AddDays(dayOffset)
End Function
var now = DateTime.Now; //17.09.2020 19:15:49
int dayInWeek = (int)now.DayOfWeek; //4
var previousMonday = now.AddDays(-(((dayInWeek + 6) % 7) + 7)); //-10
var previousSunday= previousMonday.AddDays(6); //-4
Console.WriteLine(previousMonday); //07.09.2020 19:15:49
Console.WriteLine(previousSunday); //13.09.2020 19:15:49
Enumerable.Range(0,7).Select(Function(r) Date.Now.AddDays(-1*r).Date).
Where(Function(r) r.DayOfWeek = DayOfWeek.Monday).FirstOrDefault()