sbron 2009-06-14 - The new clock scan in Tcl 8.5 is too lenient to be used to check if a string contains a valid time and date. The following proc attempts to do a better job. It returns 1 for a valid time/date and 0 if it is bogus.
Examples:
proc timevalidate {format str} {
# Start with a simple check: If the string cannot be parsed against
# the specified format at all it's definitely wrong
if {[catch {clock scan $str -format $format} time]} {return 0}
# Create a table for translating the supported clock format specifiers
# to scan format specifications
set map {%a %3s %A %s %b %3s %B %s %d %2d %D %2d/%2d/%4d
%e %2d %g %2d %G %4d %h %s %H %2d %I %2d %j %3d
%J %d %k %2d %l %2d %m %2d %M %2d %N %2d %p %2s
%P %2s %s %d %S %2d %t \t %T %2d:%2d:%2d %u %1d
%V %2d %w %1d %W %2d %y %2d %Y %4d %z %4d %Z %s
}
# Build the scan format string out of the clock format string
set scanfmt [string map $map $format]
# Recreate the time string from the seconds value
set tmp [clock format $time -format $format]
# Scan both versions of the string representation
set list1 [scan $str $scanfmt]
set list2 [scan $tmp $scanfmt]
# Compare all elements as numbers and strings
foreach n1 $list1 n2 $list2 {
if {$n1 != $n2 && ![string equal -nocase $n1 $n2]} {return 0}
}
# Declare the time string valid since all elements matched
return 1
}EMJ 2017-01-13 : Changed the map for %Y from %2d to %4d - might there be others like this?