嘿伙计们,我目前有一个子程序,我原本希望在一天和一个月的日期。然后检查它是哪个月以及该月的天数是否正确
这是我目前拥有的: 月和日分别是输入的月份和日期
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就会在任何月份返回正常状态。有没有更简单的方法呢?
提前致谢
答案 0 :(得分:4)
由于闰年,你真的需要这一年。内置功能提供:
Dim numDays As Integer = DateTime.DaysInMonth(Now.Year, Now.Month)
dateOkay = (day <= numDays)
答案 1 :(得分:0)
此方法可让您查看whole date
,并删除了将whole date
拆分为day
,month
,year
的必要性。你可以试试这个,
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
将不会评估任何其他条件测试。
相比之下,And
和Or
将评估所有测试,无论结果如何。例如,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的回答是最好的回答“有没有更简单的方法?”。