Those of us who lived through Y2K remember that, after all was said and done, it was little more than an inconvenience. Fix a couple of reports displaying “19100” here and correct some validation logic there. Although Sherman wasn’t there to experience all of the Y2K fun, as a maintenance programmer, he has had the pleasure of experiencing exactly what it was like, each and every year.
In fact, his very first assignment was to fix a Y2.007K bug in an application developed the previous year: the original developer simply hard-coded 2006 as the year. And it wasn’t the only Y2.007 bug.
2008 introduced a whole slew of problems, but most of the problems had an easy work-around: just wait until March 1st. It’s not that the developers didn’t know about the leap year, it’s just they had very often implemented the logic incorrectly.
Last year (2010) was a bigger than he figured, one, as several developers (many just copy/pasting from each other) believed you could simply take the last digit of the year and increment it to find the next year... leaving the current year as 2000 or 20011.
And sadly, this year was no different. One of the very first tickets of 2011 was a high-priority, fix-by-January-2nd issue that centered around the following code.
Function CheckValidDate(thisDate As String)
CheckValidDate = True
Dim thisChar As String
Dim i As Integer
Dim slashCount As Integer
Dim dayStr As String
Dim monthStr As String
Dim yearStr As String
Dim myAsc As Long
For i = 0 To Len(thisDate) - 1
thisChar = Left(thisDate, i + 1)
thisChar = Right(thisChar, 1)
myAsc = Asc(thisChar)
If (thisChar = "/") Then
slashCount = slashCount + 1
ElseIf (slashCount = 0) Then
monthStr = monthStr & thisChar
ElseIf (slashCount = 1) Then
dayStr = dayStr & thisChar
Else
yearStr = yearStr & thisChar
End If
If ((myAsc < 47 Or myAsc > 57) And myAsc <> Asc("/")) Then
CheckValidDate = False
End If
Next
If (slashCount <> 2) Then
CheckValidDate = False
End If
If (CheckValidDate = True) Then
Dim dayInt As Integer
Dim monthInt As Integer
Dim yearInt As Integer
dayInt = CInt(dayStr)
monthInt = CInt(monthStr)
yearInt = CInt(yearStr)
If (monthInt < 1 Or monthInt > 12) Then
CheckValidDate = False
ElseIf (monthInt = 2) Then
If (dayInt > 28 And yearInt Mod 4 <> 0) Then
CheckValidDate = False
ElseIf (dayInt > 29 And yearInt Mod 4 = 0) Then
CheckValidDate = False
End If
ElseIf ((monthInt = 4 Or monthInt = 6 Or monthInt = 9 Or monthInt = 11) And dayInt > 30) Then
CheckValidDate = False
ElseIf (dayInt > 31) Then
CheckValidDate = False
End If
If ((yearInt > 10 And yearInt < 100) Or (yearInt > 100 And yearInt < 2000) Or (yearInt > 2010)) Then
CheckValidDate = False
End If
End If
End Function
Sherman replaced the entire method body with CheckValidDate = IsDate(thisDate).