Vb.net 检查每个月的天数是否正确

Vb.net 检查每个月的天数是否正确,vb.net,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 = 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

目前,dateOkay在任何月份都会返回OK,只要输入的天数,因为闰年,您也确实需要年份。有一个内置功能提供:

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

dateOkay = (day <= numDays)

因为闰年,你也需要闰年。有一个内置功能提供:

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

dateOkay = (day <= numDays)

此方法允许您检查整个日期,并且消除了将整个日期拆分为日、月、年的必要性。你可以试试这个

  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
编辑:


如果要向用户显示通用验证消息,如“无效日期!”,您可以使用此方法,否则,如果要显示“无效日期!”之类的唯一消息,然后,您可以按照LarsTech的建议使用DaysInMonth。

此方法允许您检查整个日期,并且消除了将整个日期拆分为日、月、年的必要性。你可以试试这个

  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
编辑:


如果要向用户显示通用验证消息,如“无效日期!”,您可以使用此方法,否则,如果要显示“无效日期!”之类的唯一消息,然后你可以按照LarsTech的建议使用DaysInMonth。

我觉得LarsTech的答案是最好的,假设你一开始使用的是DateTime,而不仅仅是月和日的整数,或者还有其他方法来计算年份

我发布了一个答案来解释为什么你的代码没有按你期望的方式工作。你的代码给你带来问题的原因是,你每月的条件测试是不正确的,并且总是返回true,这意味着你的内部IF语句会执行

If Month = 4 Or 6 Or 9 Or 11 Then
6、9和11都将计算为true,使整个if check为true我相信在VB.NET中,任何非零整数值都将计算为true,但无法找到一个链接来证实它。不过,在VS 2012中在我的机器上进行的测试支持这一点,以及我看到的一些其他讨论

因此,所发生的是,您为当月编写的最后一个if块将始终计算为True,并且只要日期为1到31 dateOkay,无论实际月份是什么,都将计算为True

你应该做的是:

If Month = 4 Or Month = 6 Or Month = 9 Or Month = 11 Then
这将按照您的预期进行计算,其余部分或您的代码将按预期工作

我建议使用OrElse而不是Or,这将使您能够执行与您使用的AndAlso类似的短路评估。换句话说,只要使用OrElse的if语句中的一个条件测试的计算结果为true,其余的条件测试将被忽略。并且,一旦遇到错误结果,也不会对任何附加条件测试进行评估

相比之下,And或将评估所有测试,无论结果如何。例如,如果Month=1或Month=3或Month=4,则将运行每个单独的测试,即使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的答案对你的问题来说是最好的,有没有更简单的方法可以做到这一点?

我觉得Larstech的答案是最好的,假设你一开始使用的是日期时间,而不仅仅是月和日的整数,或者还有其他方法来计算年份

我发布了一个答案来解释为什么你的代码没有按你期望的方式工作。你的代码给你带来问题的原因是,你每月的条件测试是不正确的,并且总是返回true,这意味着你的内部IF语句会执行

If Month = 4 Or 6 Or 9 Or 11 Then
6、9和11都将计算为true,使整个if check为true我相信在VB.NET中,任何非零整数值都将计算为true,但无法找到一个链接来证实它。不过,在VS 2012中在我的机器上进行的测试支持这一点,以及我看到的一些其他讨论

因此,所发生的是,您为当月编写的最后一个if块将始终计算为True,并且只要日期为1到31 dateOkay,无论实际月份是什么,都将计算为True

你应该做的是:

If Month = 4 Or Month = 6 Or Month = 9 Or Month = 11 Then
这将按照您的预期进行计算,其余部分或您的代码将按预期工作

我建议使用OrElse而不是Or,这将使您能够执行与您使用的AndAlso类似的短路评估。换句话说,只要使用OrElse的if语句中的一个条件测试的计算结果为true,其余的条件测试将被忽略。并且,一旦遇到错误结果,也不会对任何附加条件测试进行评估

相比之下,和或将评估 无论结果如何,都要完成所有测试。例如,如果Month=1或Month=3或Month=4,则将运行每个单独的测试,即使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的答案对你的问题来说是最好的,有没有更简单的方法呢?

Oops,很抱歉我匆忙发布了这个答案,刚才我看到了下面tim的评论。好的,那么Op先生,您如何输入用户的日期。?单独[日期,月,年]或作为一个完整的日期。哎呀,对不起,我在匆忙中发布了这个答案,刚才我看到了下面蒂姆的评论。好的,那么Op先生,您如何输入用户的日期。?单独[日期、月份、年份]或作为一个整体日期。非常感谢您的解释:^^非常感谢您的解释:^完美的答案。非常完美的答案。效果很好