查找一个月内经典的多少个星期日

时间:2014-08-19 09:26:36

标签: date vbscript asp-classic

我正在尝试使用asp classic来查找当月有多少个工作日(mon-sat)以及剩下多少个工作日。

任何帮助或指针非常感谢!

3 个答案:

答案 0 :(得分:2)

以下是如何在没有迭代的情况下找到一个月内的星期日数。有人在几个月前发布了一个JavaScript解决方案并将其移植到VBScript:

Function GetSundaysInMonth(intMonth, intYear)
    dtmStart = DateSerial(intYear, intMonth, 1)
    intDays = Day(DateAdd("m", 1, dtmStart) - 1)
    GetSundaysInMonth = Int((intDays + (Weekday(dtmStart) + 5) Mod 7) / 7)
End Function

因此,您的总工作日数只是该月的天数减去星期日的数量。

修改

正如@Lankymart在评论中指出的那样,上面的函数给出了月中星期日的数量,但它并没有告诉你剩下多少星期日。

这是另一个版本。通过任何日期,它会告诉你从该日期开始的月份中剩下多少个星期日。如果您想知道完整月中有多少个星期日,请在该月的第一天传递(例如DateSerial(2014, 8, 1))。

Function GetSundaysRemainingInMonth(dtmStart)
    intDays = Day(DateSerial(Year(dtmStart), Month(dtmStart) + 1, 1) - 1)
    intDays = intDays - Day(dtmStart) + 1
    GetSundaysRemainingInMonth = Int((intDays + (Weekday(dtmStart) + 5) Mod 7) / 7)
End Function

编辑2:

@Cheran Shunmugavel对一些有关其工作原理的细节感兴趣。首先,我只想重申,我最初并没有开发出这种方法。我把它移植到VBScript并根据OP的要求(周日)进行了调整。

想象一下闰年的二月。我们这个月有29天。我们从一开始就知道我们有四个星期,所以每个工作日至少会有四次。但是,这仍然是一个额外的日子(29 Mod 7 = 1)下落不明。我们如何知道我们是否从那一天获得额外的星期天?嗯,在这种情况下,它非常简单。只有我们的开始日期是星期日,我们才能计算一个月的额外星期日。

如果这个月有30天怎么办?然后我们还有两天需要考虑。在这种情况下,开始日期可以是星期六或星期日,我们可以计算该月的额外星期日。它就这样了。所以我们可以看到,如果我们在即将到来的星期天再过X天,我们就可以计算一个额外的星期天。

让我们以表格形式表达:

            Addl Days Needed
Day         To Count Sunday
----------  ----------------
Sunday      1
Saturday    2
Friday      3
Thursday    4
Wednesday   5
Tuesday     6
Monday      7

所以我们需要的是一个公式,我们可以应用于这些情况,以便它们都能产生相同的值。我们需要为每天分配一些值,并将该值与星期日计算所需的额外天数相结合。似乎合理的是,如果我们将值分配给工作日并将其添加到额外天数,我们可以得到相同的结果。

            Addl Days Needed  Value Assigned
Day         To Count Sunday   To Weekday      Sum
----------  ----------------  --------------  ---
Sunday      1                 6               7 
Saturday    2                 5               7
Friday      3                 4               7
Thursday    4                 3               7
Wednesday   5                 2               7
Tuesday     6                 1               7
Monday      7                 0               7

所以,如果weekday_value + addl_days = 7那么我们就算一个额外的星期天。 (我们稍后将其除以7,以便给我们 1 额外的星期日)。但是我们如何在工作日分配我们想要的值呢?好吧,VBScript的Weekday()功能已经做到了这一点,但遗憾的是,它并没有默认使用我们需要的值(它在星期六使用1代表星期日到7代)。我们可以使用第二个参数更改Weekday()的工作方式,或者我们可以使用Mod()。这就是+ 5 Mod 7的用武之地。如果我们取Weekday()值并加5,然后按7修改,我们得到我们需要的值。

Day         Weekday()  +5  Mod 7
----------  ---------  --  -----
Sunday      1          6   6
Saturday    7          12  5
Friday      6          11  4
Thursday    5          10  3
Wednesday   4          9   2
Tuesday     3          8   1
Monday      2          7   0

+ 5 Mod 7是如何确定的。并且,解决了这个问题,其余的很容易(呃)!

答案 1 :(得分:0)

@Zam on the right track您需要使用WeekDay()函数,以下是编写脚本的基本概念;

<%
Dim month_start, month_end, currentdate, dayofmonth
Dim num_weekdays, num_past, num_future
Dim msg

'This can be configured how you like even use Date().
month_start = CDate("01/08/2014")
month_end = DateAdd("d", -1, DateAdd("m", 1, month_start))

msgbox(Day(month_end))

For dayofmonth = 1 To Day(month_end)
  currentdate = CDate(DateAdd("d", dayofmonth, month_start))
  'Only ignore Sundays
  If WeekDay(currentdate) <> vbSunday Then
    num_weekdays = num_weekdays + 1
    If currentdate <= Date() Then
      num_past = num_past + 1
    Else
      num_future = num_future + 1
    End If
  End If
Next

msg = ""
msg = msg & "Start: " & month_start & "<br />"
msg = msg & "End: " & month_end & "<br />"
msg = msg & "Number of Weekdays: " & num_weekdays & "<br />"
msg = msg & "Weekdays Past: " & num_past & "<br />"
msg = msg & "Weekdays Future: " & num_future & "<br />"

Response.Write msg
%>

答案 2 :(得分:-1)

如何使用“工作日函数返回1到7之间的数字,表示星期几。” ?