Table of Contents
IsDate and IsTime functions (VB Work-A-Like)
The following are two functions to validate dates and times.
Inspired by the VB functions of the same name.
Often when a user is asked to enter either, there is quite a bit of code to make sure that what they entered makes sense. These functions check both the format and values and return a boolean (actually an integer) of 0 if the string is not a Date/Time. Non zero indicates the string is valid.
Earlier versions of these functions used Regular Expressions to match the “look & feel” of time and date strings. This made things very easy but RegExps are notoriously compute-heavy. Previous versions were quite slow and had the huge code overhead of the RegExp module. If you were only using RegExps for IsDate/IsTime was difficult to justify the extra 2K of program.
The versions presented below, dispense with the RegExps. Consequently they are a bit longer than the originals (not including the RegExp module) but total code footprint is much-reduced and they are now very quick - about seven times faster.
Check the history of this article if you are curious about the versions using RegExps.
Notes IsDate:
- Only supports UK/AUS date formats of dd/mm/yyyy
- The delimiter may be either / or - e.g. dd-mm-yyyy or dd/mm/yyyy is fine.
Notes IsTime:
- Times must be formatted as hh:mm:ss
Syntax:
=IsTime(TimeStr$) =IsDate(DateStr$)
Examples:
If Not IsDate(dt$) Then Exit Sub Checkbox=IsTime(A$)
Dependencies:
Function IsTime(a$) As Integer Local d$ Local Integer x,z IsTime=0 If Len(a$)=8 Then d$=Mid$(a$,3,1) If d$=":" Then d$=Mid$(a$,6,1) If d$=":" Then 'here a$=??:??:?? For x=1 To 8 If x=3 or x=6 Then Else z=Asc(Mid$(a$,x,1)) If z<&h30 Or z>&h39 Then Exit Function EndIf Next If Val(Left$(a$,2))<24 Then If Val(Mid$(a$,4,2))<60 Then If Val(Right$(a$,2))<60 Then IsTime=1 EndIf EndIf EndIf EndIf EndIf EndIf End Function Function IsDate(a$) As Integer Local d$ Local Integer x,z IsDate=0 If Len(a$)=10 Then d$=Mid$(a$,3,1) If d$="-" Or d$="/" Then d$=Mid$(a$,6,1) If d$="-" Or d$="/" Then 'here a$=??/??/???? For x=1 To 10 If x=3 Or x=6 Then Else z=Asc(Mid$(a$,x,1)) If z<&h30 Or z>&h39 Then Exit Function EndIf Next x=Val(Left$(a$,2)):z=Val(Mid$(a$,4,2)) If x<1 Then Exit Function Select Case z Case 1,3,5,7,8,10,12 If x>31 Then Exit Function Case 4,6,9,11 If x>30 Then Exit Function Case 2 If x>28+IsLeapYear(Val(Right$(a$,4))) Then Exit Function Case Else Exit Function End Select IsDate=1 EndIf EndIf EndIf End Function
There are several optimizations possible on the above code that have been omitted in the interests of legibility.