【问题标题】:Is there a specific function that will return whether or not a given date in is the last full week of the curent month是否有一个特定的函数可以返回给定日期是否是当前月份的最后一周
【发布时间】:2015-07-06 07:33:10
【问题描述】:

有很多方法可以确定给定日期的星期数或星期几。我想在我的应用程序中创建一个例程,在该月的最后一个星期五(可能等于也可能不等于本月最后一个完整周的这个星期五)执行一些例行的家务工作。

我想到了一些类似这些行的伪代码;

If AreWeOnTheFridayOfLastFullWeekOfTheMonth Then
    <carry out housekeeping here>
End if


Private Function AreWeOnTheFridayOfLastFullWeekOfTheMonth

        Dim dte As Date = Today

       If dte.DayOfWeek.ToString = "Friday" Then
        If <dte is in the last full week of the current month > then
            Return True
        Else
            Return False
        End

End Sub

有谁知道在各种 dot net 程序集中是否有这样的功能(我还没有在本月的第一周或最后一周的各种 google 或 bing 搜索中遇到过这种功能)或某种方式来确定它。

虽然我使用的是 vb,但答案是否在 c# 中并不重要,但明显的附带条件是它使用两种语言共有的函数和方法。

编辑

我看到了this 的问题。我想知道是否有一种更简单的方法可以简单地确定我们是否在本月的最后一周。

谢谢

编辑 2:

只是想我会添加 Jeppe Stig Nielsen 给出的上述两个简洁示例的 vb 翻译请注意,我已将 Today 替换为每种情况下的日期参数,这意味着您可以调用该函数并根据任何内容获得布尔返回是你叫它的日子。

Public Function TodayIsTheLastFridayOfTheLastFullWeekOfTheMonth() As Boolean
    Dim daysLeftInMonth  As Integer = DateTime.DaysInMonth(Today.Year, Today.Month) - Today.Day
    Return Today.DayOfWeek = DayOfWeek.Friday AndAlso 8 > daysLeftInMonth AndAlso daysLeftInMonth >= 1
End Function

Public Function IsTodayWithinTheLastFullWeek() As Boolean
    Dim dayOfWeekAsInt As Integer = CInt(Today.DayOfWeek) ' take more care here if 'first' day-of-week is not defined as Sunday
    Dim dateOfBeginningOfWeek As Date = Today.AddDays(-dayOfWeekAsInt)
    Dim daysLeftInMonth As Integer = DateTime.DaysInMonth(dateOfBeginningOfWeek.Year, dateOfBeginningOfWeek.Month) - dateOfBeginningOfWeek.Day
    Return 13 > daysLeftInMonth AndAlso daysLeftInMonth >= 6
End Function

EDIT3

以及 Jeppe 对本月第一周的最终评论;

Public Function IsTodayWithinTheFirstFullWeek() As Boolean
        Dim dayOfWeekAsInt As Integer = CInt(Today.DayOfWeek)
        Dim dateOfBeginningOfWeek As Date = Today.AddDays(-dayOfWeekAsInt)
        Return dateOfBeginningOfWeek.Day <= 7
    End Function

【问题讨论】:

  • 指定上一整周。如果最后一个星期五是在一个有 6 天的一周内怎么办?展示一些例子,包括边缘情况。
  • 您认为一整周是周日到周六、周一到周日、周六到周五、周一到周五还是其他?
  • @TimSchmelter 如果我们以上周为例(我正在考虑从周日开始到周六结束的一周),它跨越了六月和七月。因此,如果我的伪函数在 6 月 26 日星期五被调用,它会返回 true,因为那将是本月的最后一周。
  • @DomSinclair 但是如果你想要一个月的最后一个星期五,你真的关心星期六是不是下个月的第一天吗?
  • "这可能等于也可能不等于本月最后一个完整周的这个星期五" 所以你不在乎它是否是最后一个完整的一周?

标签: .net vb.net date


【解决方案1】:

要获得一个月中的最后一个星期五,您可以使用:

Public Function GetLastFridayInMonth(ByVal aDate As Date) As Date
    Dim firstDayOfNextMonth = (New Date(aDate.Year, aDate.Month, 1)).AddMonths(1)
    Dim delta As Integer = ((CInt(firstDayOfNextMonth.DayOfWeek) + 1) Mod 7) + 1
    Return firstDayOfNextMonth.AddDays(-delta)
End Function

如果您希望该月的最后一个星期五是一个完整的一周,那么您需要定义完整的一周的含义,因为有不同的解释。是一周中的所有日子都在一个月内(哪一天是一周的开始/结束)还是那一周的 4/7 天?

【讨论】:

  • 不能怪马特,这是一个很好的例子,当然很容易让我确定它是否确实是本月的最后一个星期五。因此,鉴于我在星期五的问题中说过这是一个正确的答案,并且我已经将其推向市场……谢谢。仍然很想知道是否有一种方法可以确定我们是否在本月的最后一个完整的一周(星期日-星期六),尽管可能对其他事情非常有用,并且大概稍微调整一下就可以应用于第一个完整的一周也是当月的。
【解决方案2】:

在 C# 中:

static bool IsLastFriday()
{
  var date = DateTime.Today; // can be made a parameter

  return date.DayOfWeek == DayOfWeek.Friday && date.Day + 7 > DateTime.DaysInMonth(date.Year, date.Month);
}

我应该更仔细地阅读您的问题。这是 C# 中的一个解决方案:

static bool IsFridayOfLastFullWeek()
{
  var date = DateTime.Today; // can be made a parameter

  var daysLeftInMonth = DateTime.DaysInMonth(date.Year, date.Month) - date.Day;

  return date.DayOfWeek == DayOfWeek.Friday
    && 8 > daysLeftInMonth && daysLeftInMonth >= 1;
}

界限 8 和 1 假设您的“整周”从周日到周六。它们可以更改为例如如果您的周概念不同,则分别为 9 和 2。


如果这不仅适用于星期五(我看到您对另一个答案的评论),请继续:

static bool IsWithingLastFullWeek()
{
  var date = DateTime.Today; // can be made a parameter

  var dayOfWeekAsInt = (int)(date.DayOfWeek); // take more care here if 'first' day-of-week is not defined as Sunday
  var dateOfBeginningOfWeek = date.AddDays(-dayOfWeekAsInt);
  var daysLeftInMonth = DateTime.DaysInMonth(dateOfBeginningOfWeek.Year, dateOfBeginningOfWeek.Month)
    - dateOfBeginningOfWeek.Day;
  return 13 > daysLeftInMonth && daysLeftInMonth >= 6;
}

【讨论】:

  • 精彩的答案绝对是加 1。如果在您的最后一个示例中(并且再次假设星期日作为一周的开始)我们正在搜索第一个完整的一周,那么它是否只是一个有趣的问题更改 return 语句中的两个整数(13 和 6)?
  • @DomSinclair 每月的第一周可能会更容易一些,因为我们不存在月份因长度不等而在不同日期(如 31 日、30 日或 28 日/29 日)结束的问题。每个月从“开始方面”看都是一样的。所以试试这个:static bool IsWithingFirstFullWeek() { var date = DateTime.Today; var dayOfWeekAsInt = (int)(date.DayOfWeek); var dateOfBeginningOfWeek = date.AddDays(-dayOfWeekAsInt); return dateOfBeginningOfWeek.Day &lt;= 7; }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多