检查每个月的天数

时间:2013-03-30 03:02:45

标签: vb.net

嘿伙计们,我目前有一个子程序,我原本希望在一天和一个月的日期。然后检查它是哪个月以及该月的天数是否正确

这是我目前拥有的: 月和日分别是输入的月份和日期

        If Month = 4 Or 6 Or 9 Or 11 Then
            If (1 <= Day) AndAlso (Day <= 30) Then
                DateOkay= True
            End If
        End If


        If Month = 2 Then
            If (1 <= Day) AndAlso (Day <= 28) Then
                DateOkay = True
            End If
        End If


        If Month = 1 Or 3 Or 5 Or 7 Or 8 Or 10 Or 12 Then
            If (1 <= Day) AndAlso (Day <= 31) Then
                DateOkay = True
            End If
        End If

只要日期输入<= 31,dateOkay就会在任何月份返回正常状态。有没有更简单的方法呢?

提前致谢

3 个答案:

答案 0 :(得分:4)

由于闰年,你真的需要这一年。内置功能提供:

Dim numDays As Integer = DateTime.DaysInMonth(Now.Year, Now.Month)

dateOkay = (day <= numDays)

答案 1 :(得分:0)

此方法可让您查看whole date,并删除了将whole date拆分为daymonthyear的必要性。你可以试试这个,

  Dim xdate As String = "20-02-2013"
  DateOkay = if(IsDate(xdate),true,false) 'This will return true

  xdate = "30-02-2013"
  DateOkay = if(IsDate(xdate),true,false) 'This will return false

修改

如果您希望向generic validation message这样的用户显示'Invalid date.!',则可以使用此方法,否则如果您希望显示unique message之类的'Invalid Day.!',那么您可以使用DaysInMonth作为LarsTech的建议。

答案 2 :(得分:0)

我觉得Larstech的答案是最好的(假设您最初使用的是DateTime,而不仅仅是月份和日期的整数,或者还有其他方式来获得这一年。)

我发布了一个答案,解释为什么您的代码没有按预期方式运行。您的代码给您带来问题的原因是您对Month的条件测试不正确并且将始终返回true,这意味着您的内部IF语句将执行。

If Month = 4 Or 6 Or 9 Or 11 Then

6,9和11将全部评估为true,使整个if检查为true(我相信任何非零整数值将在VB.NET中评估为true,但无法挖掘链接为了证实这一点。在VS 2012中对我的机器进行的测试支持了这一点,以及我见过的其他一些讨论。

所以正在发生的事情是,本月的最后一个if块(正如你所写的那样)将始终评估为True,并且只要该日期为1到31 dateOkay将评估无论实际月份是什么,都是如此。

你应该做的是:

If Month = 4 Or Month = 6 Or Month = 9 Or Month = 11 Then

这将按照您的预期进行评估,其余部分或您的代码将按预期工作。

我建议使用OrElse代替Or,这样您就可以执行类似于您使用的AndAlso的短路评估。换句话说,只要使用OrElse的if语句中的一个条件测试求值为true,其余的条件测试将被忽略。一旦遇到False结果,AndAlso将不会评估任何其他条件测试。

相比之下,AndOr将评估所有测试,无论结果如何。例如,If Month = 1 Or Month = 3 Or Month = 4 Then将运行每个单独的测试,即使Month为1。

最后,如果您在评估日期之前未设置dateOkay,我会在评估之前将其明确设置为False。总而言之,你会得到这样的东西:

dateOkay = False

If Month = 4 OrElse Month = 6 OrElse Month = 9 OrElse Month = 11 Then
    If (1 <= Day) AndAlso (Day <= 30) Then
        DateOkay= True
    End If
End If

If Month = 2 Then
    If (1 <= Day) AndAlso (Day <= 28) Then
        DateOkay = True
    End If
End If

If Month = 1 OrElse Month = 3 OrElse Month = 5 OrElse Month = 7 OrElse Month = 8 OrElse Month = 10 OrElse Month = 12 Then
    If (1 <= Day) AndAlso (Day <= 31) Then
        DateOkay = True
    End If
End If

然而,Larstech的回答是最好的回答“有没有更简单的方法?”。