【问题标题】:Get Date of Previous Monday获取上周一的日期
【发布时间】:2015-03-10 02:18:08
【问题描述】:

我正在尝试获取本周的星期一日期。这接近正确吗?

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

在我看来是正确的。

还是我完全不在了?

【问题讨论】:

  • 它是 C#,但有一个 semi-duplicate here,它有一个很好的功能,您可以在一周中的任何一天使用。
  • 另一方面,虽然枚举不应该在未来的版本中发生变化,但它们总是有可能可以。我会非常警惕基于枚举的值执行算术。
  • 他到底为什么要使用枚举?星期几是内置在 .NET 框架中的。
  • FWIW - 不是星期日 0 吗?

标签: .net vb.net date days date-difference


【解决方案1】:
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

【讨论】:

  • 一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。
【解决方案2】:

如果您正在寻找前一周的星期一到星期日的范围,那么您可以使用这些函数来获取它们(修改后的版本来自 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

【讨论】:

    【解决方案3】:

    这应该做你想做的事。它从提供的日期查找前一个星期一。没有循环,因此速度很快,并且不依赖枚举值进行算术调整,因此即使枚举值发生变化也不会中断:

    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
    

    【讨论】:

      【解决方案4】:

      一种非常简单的替代方法,虽然性能可能不高,但确实避免了任何基于算术的错误:

      Dim monday As Date = Date.Today
      While (monday.DayOfWeek <> DayOfWeek.Monday)
          monday = monday.AddDays(-1)
      End While
      

      这可以很容易地扩展到处理一周中的任何一天的函数。除非这是一段非常大量的代码,否则性能会很好。

      【讨论】:

      • @Matt 确实。但是 OP 是在星期一之后,而不是开始日。
      • 实际上他具体是在当前周的星期一之后,而不是上一个星期一
      • @Matt 啊,是的 - 我明白你的意思
      • 我没有详细说明我的问题。我想的还不够。但是上周一,这个答案得到的正是我所需要的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 2017-09-16
      • 1970-01-01
      • 2021-12-31
      • 2011-01-25
      • 1970-01-01
      相关资源
      最近更新 更多