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)
.