Index: openacs-4/packages/acs-templating/tcl/date-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-templating/tcl/date-procs.tcl,v diff -u -N -r1.63.2.3 -r1.63.2.4 --- openacs-4/packages/acs-templating/tcl/date-procs.tcl 25 Apr 2019 08:37:06 -0000 1.63.2.3 +++ openacs-4/packages/acs-templating/tcl/date-procs.tcl 25 Apr 2019 09:21:16 -0000 1.63.2.4 @@ -120,8 +120,13 @@ } ad_proc -public template::util::date::create { - {year {}} {month {}} {day {}} {hours {}} - {minutes {}} {seconds {}} {format "DD MONTH YYYY"} + {year {}} + {month {}} + {day {}} + {hours {}} + {minutes {}} + {seconds {}} + {format "DD MONTH YYYY"} } { Create a new Date object I chose to implement the date objects as lists instead of @@ -248,19 +253,19 @@ if {[lindex $date 0] eq ""} { return {} } else { - return [expr {[lindex $date 0] % 100}] + return [expr {[lindex $date 0] % 100}] } } short_hours { if {[lindex $date 3] eq ""} { return {} } else { set value [expr {[lindex $date 3] % 12}] - if { $value == 0 } { + if { $value == 0 } { return 12 - } else { + } else { return $value - } + } } } ampm { @@ -299,7 +304,7 @@ append format $space append format $sql_form set space " " - } + } set pad "00" } # DRB: We need to differentiate between date and timestamp, for PG, at least, @@ -376,10 +381,10 @@ set value [lc_time_fmt [join $date_list "-"] "%q"] unpack $date if { $hours ne "" && $minutes ne "" } { - append value " [string range $pad [string length $hours] end]${hours}:[string range $pad [string length $minutes] end]$minutes" - if { $seconds ne {} } { - append value ":[string range $pad [string length $seconds] end]$seconds" - } + append value " [string range $pad [string length $hours] end]${hours}:[string range $pad [string length $minutes] end]$minutes" + if { $seconds ne {} } { + append value ":[string range $pad [string length $seconds] end]$seconds" + } } return $value } @@ -394,7 +399,7 @@ append value " ${hours}:${minutes}" if { $seconds ne "" } { append value ":$seconds" - } + } } return [clock scan $value] } @@ -482,7 +487,7 @@ return [lreplace $date 3 3 [expr {$hours + 12}]] } elseif {$value eq "am"} { return [lreplace $date 3 3 [expr {$hours % 12}]] - } else { + } else { return $date } } @@ -561,45 +566,59 @@ uplevel [list foreach {year month day hours minutes seconds format} $date { break }] } -ad_proc -public template::util::date::now_min_interval {} { +ad_proc -public template::util::date::now_min_interval { + {-clock ""} +} { Create a new Date object for the current date and time with the default interval for minutes + @param clock time in seconds, if not specified, it uses current time + @author Walter McGinnis (wtem@olywa.net) @creation-date 2002-01-06 } { - set now [list] - foreach v [clock format [clock seconds] -format "%Y %m %d %H %M %S"] { - lappend now [util::trim_leading_zeros $v] - } + if {$clock eq ""} { + set clock [clock seconds] + } - # manipulate the minute value so it rounds up to nearest minute interval - set minute [lindex $now 4] - # there is a definition for minute interval: 0 59 5 - set interval_def [defaultInterval minutes] - for { set i [lindex $interval_def 0] } \ - { $i <= [lindex $interval_def 1] } \ - { incr i [lindex $interval_def 2] } { - if {$minute == $i} { - break - } elseif {$minute < $i} { - set minute $i - break - } - } + set now [list] + foreach v [clock format $clock -format "%Y %m %d %H %M %S"] { + lappend now [util::trim_leading_zeros $v] + } + # + # Get original minute value + # + set minute [lindex $now 4] - # replace the minute value in the now list with new value - #set now [lreplace $now 4 4 $minute] - lset now 4 $minute + # + # Get interval definition for "minute" (e.g. 0 59 5) + # + lassign [defaultInterval minutes] min max interval - return [create {*}$now] + for { set i $min } { $i <= $max } { incr i $interval } { + if {$minute == $i} { + break + } elseif {$minute < $i} { + set minute $i + break + } + } + # + # Replace the minute value in the now list with new value + # + lset now 4 $minute + + return [create {*}$now] } -ad_proc -deprecated template::util::date::now_min_interval_plus_hour {} { +ad_proc -deprecated -public template::util::date::now_min_interval_plus_hour { + {-clock ""} +} { Create a new Date object for the current date and time - plus one hour - with the default interval for minutes + plus one hour with the default interval for minutes + @param clock time in seconds, if not specified, it uses current time + Deprecated: as of 2019-04-25, no upstream code is making use of this proc and more generic alteratives exist. @@ -609,32 +628,33 @@ @author Walter McGinnis (wtem@olywa.net) @creation-date 2002-01-06 } { - set now [list] - foreach v [clock format [clock seconds] -format "%Y %m %d %H %M %S"] { - lappend now [util::trim_leading_zeros $v] - } + if {$clock eq ""} { + set clock [clock seconds] + } + # + # Add one hour to the clock + # + incr clock [expr {60*60}] - # manipulate the minute value so it rounds up to nearest minute interval - set minute [lindex $now 4] - # there is a definition for minute interval: 0 59 5 - set interval_def [defaultInterval minutes] - for { set i [lindex $interval_def 0] } \ - { $i <= [lindex $interval_def 1] } \ - { incr i [lindex $interval_def 2] } { - if {$minute == $i} { - break - } elseif {$minute < $i} { - set minute $i - break - } - } + set now [list] + foreach v [clock format $clock -format "%Y %m %d %H %M %S"] { + lappend now [util::trim_leading_zeros $v] + } - # get the hour value - set hour [lindex $now 3] - # replace the hour and minute values in the now list with new values - set now [lreplace $now 3 4 [incr hour] $minute] + # manipulate the minute value so it rounds up to nearest minute interval + set minute [lindex $now 4] + # there is a definition for minute interval: 0 59 5 + lassign [defaultInterval minutes] min max inc + for {set i $min} {$i <= $max} {incr i $inc} { + if {$minute == $i} { + break + } elseif {$minute < $i} { + set minute $i + break + } + } - return [create {*}$now] + return [create {*}$now] } ad_proc -public template::util::date::add_time { {-time_array_name:required} {-date_array_name:required} } { @@ -654,7 +674,7 @@ # create an empty date object with the new format set the_date [template::util::date::create \ - "" "" "" "" "" "" ""] + "" "" "" "" "" "" ""] set the_date [template::util::date::set_property format $the_date $new_format] @@ -665,44 +685,44 @@ # add time properties foreach field [array names time_in] { - # skip format - if {$field ne "format" } { - # Coerce values to non-negative integers - if { $field ne "ampm" } { - if { ![regexp {[0-9]+} $time_in($field) value] } { - set value {} - } - } - # If the value is not null, set it - if { $value ne {} } { - set the_date [template::util::date::set_property $field $the_date $value] - if { $field ne "ampm" } { - set have_values 1 - } - } - } + # skip format + if {$field ne "format" } { + # Coerce values to non-negative integers + if { $field ne "ampm" } { + if { ![regexp {[0-9]+} $time_in($field) value] } { + set value {} + } + } + # If the value is not null, set it + if { $value ne {} } { + set the_date [template::util::date::set_property $field $the_date $value] + if { $field ne "ampm" } { + set have_values 1 + } + } + } } # add date properties foreach field [array names date_in] { - # skip format - if {$field ne "format" } { - # Coerce values to non-negative integers - if { ![regexp {[0-9]+} $date_in($field) value] } { - set value {} - } - # If the value is not null, set it - if { $value ne {} } { - set the_date [template::util::date::set_property $field $the_date $value] - set have_values 1 - } - } + # skip format + if {$field ne "format" } { + # Coerce values to non-negative integers + if { ![regexp {[0-9]+} $date_in($field) value] } { + set value {} + } + # If the value is not null, set it + if { $value ne {} } { + set the_date [template::util::date::set_property $field $the_date $value] + set have_values 1 + } + } } if { $have_values } { - return [list $the_date] + return [list $the_date] } else { - return {} + return {} } } @@ -740,17 +760,17 @@ # If the field is required, but missing, report an error if {[set $field] eq ""} { - if { [regexp $exp $format match] } { - set field_pretty [_ acs-templating.${field}] - lappend error_msg [_ acs-templating.lt_No_value_supplied_for_-field_pretty-] - } + if { [regexp $exp $format match] } { + set field_pretty [_ acs-templating.${field}] + lappend error_msg [_ acs-templating.lt_No_value_supplied_for_-field_pretty-] + } } else { - # fields should only be integers - if { ![regexp {^[0-9]+$} [set $field] match] } { - set field_pretty [_ acs-templating.${field}] - lappend error_msg [_ acs-templating.lt_The_-field_pretty-_must_be_non_negative] - set $field {} - } + # fields should only be integers + if { ![regexp {^[0-9]+$} [set $field] match] } { + set field_pretty [_ acs-templating.${field}] + lappend error_msg [_ acs-templating.lt_The_-field_pretty-_must_be_non_negative] + set $field {} + } } } @@ -767,12 +787,12 @@ set maxdays [get_property days_in_month $date] if { [string trimleft $day "0"] < 1 || [string trimleft $day "0"] > $maxdays } { set month_pretty [template::util::date::get_property long_month_name $date] - if { $month == 2 } { - # February has a different number of days depending on the year - append month_pretty " ${year}" - } - lappend error_msg [_ acs-templating.lt_day_between_for_month_pretty] - } + if { $month == 2 } { + # February has a different number of days depending on the year + append month_pretty " ${year}" + } + lappend error_msg [_ acs-templating.lt_day_between_for_month_pretty] + } } } } @@ -889,8 +909,8 @@ } else { # Display text entry for some elements, or if the type is text if { $type == "t" - || [regexp "year|short_year" $fragment] - } { + || [regexp "year|short_year" $fragment] + } { set output "