if 0 {
**General Notes**
A demo for all the format groups recognized by the clock scan and clock format commands.
References to programs and pages here :
* WorldtimeClock - http://wiki.tcl.tk/14375
* clock scan - http://wiki.tcl.tk/2525
**Notes about working with tcl**
* As I already ranted, the Doku/Help has not enough useful examples.<
>So, this demo is how such an example-program could look like, with almost everything copied/pasted directly from "Tcl/Tk Documentation > TclCmd > clock".
**Program**
----
}
======tcl
# ClockDemo05.tcl - Mike Hase - 2015-03-03
# http://wiki.tcl.tk/41210
set Prog(title) "ClockDemo"
set Prog(version) "v0.05"
set Prog(date) "2015-03-03"
### clock format-codes:
# Code Type: Description
array set fTab {
%a "Wd: Day of the week, abbreviation, localized"
%A "Wd: Day of the week, full name, localized"
%b "Dm: Name of the month, abbreviation, localized"
%B "Dm: Name of the month, full name, localized"
%c "TD: Date and time of day, localized"
%C "Dy: Century, Indo-Arabic numerals"
%d "Dm: Number of the day of the month, two decimal digits"
%D "D_: Date, as in %m/%d/%Y"
%e "Dd: Number of the day of the month, one (with a leading blank) or two decimal digits"
%g "Dy: Two-digit year number, for use with the week-based ISO8601 calendar"
%G "Dy: Four-digit year number for use with the week-based ISO8601 calendar"
%h "Dm: Name of the month, as in %b"
%H "Th: Hour of the day (00-23), on a 24-hour clock."
%I "Th: Hour of the day (12-11), on a 12-hour clock."
%j "Dd: Day of the year (001-366), three-digits"
%J "D_: Julian Day Number, since 1 January, 4713 BCE."
%k "Th: Hour of the day (00-23), one- or two-digits, 24-hour clock."
%l "Th: Hour of the day (12-11), one- or two-digits, 12-hour clock."
%m "Dm: Number of the month (01-12) with two digits"
%M "Tm: Number of the minute of the hour (00-59) with two digits."
%N "Dm: Number of the month (1-12) one (with a leading blank) or two digits"
%p "D_: Part of the day, AM or PM, localized"
%P "D_: Part of the day, am or pm, localized"
%Q "X_: (internal use:)"
%r "T_: Time of the day, on a 12-hour clock, localized"
%R "T_: Time of the day, on a 24-hour clock, localized"
%s "T_: Clockseconds as decimal integer"
%S "Ts: Second of the minute (00-59)."
%T "T_: Time, as in %H:%M:%S."
%u "Wd: Number of the day of the week (1=Monday, 7=Sunday)"
%U "Dw: Ordinal number of the week of the year (00-53). (obsolete)"
%V "Dw: Number of the ISO8601 week as a two digit number (01-53)."
%w "Wd: Day of the week, ordinal number (Sunday=0; Saturday=6)."
%W "Dw: Week number (00-53) within the year"
%x "D_: Date, localized"
%X "T_: Time, localized"
%y "Dy: Year, two digits (1938-2037)"
%Y "Dy: Year, four digits (1938-2037)"
%z "Z_: Timezone, in hours and minutes east (+hhmm) or west (-hhmm) of Greenwich."
%Z "Z_: Timezone as name, localized"
%+ "TD: TimeDate, as in %a %b %e %H:%M:%S %Z %Y"
}
### Display:
proc show0 {} {
global cs td
set td [clock format $cs -format "%Y-%m-%d %H:%M:%S" ]
puts "--"
puts "clock seconds: $cs TimeDate: $td"
}
proc show1 {} {
global cs td fTab
puts "\nAll codes, unsorted:"
foreach {fc descr} [array get fTab] {
set res [clock format $cs -format $fc ]
puts [format "%-3s %-28s %s" $fc $res $descr]
}
}
proc show2 { select title } {
global cs td fTab
puts "\n$title:"
set res "xx"
set i 0
foreach fc [lsort -dict [array names fTab] ] {
incr i 1
set descr $fTab($fc)
set type [string range $descr 0 0]
set desc1 [string range $descr 4 end]
if {$type == $select} {
set res [clock format $cs -format $fc ]
puts [format "%-3s %-28s %s" $fc $res $desc1]
}
}
}
### Time:
proc now {} {
global cs td fTab
set cs [clock seconds]
set td [clock format $cs -format "%Y-%m-%d %H:%M:%S" ]
}
### Time/Repeat/Wait:
proc every {ms body} {
if 1 $body
after $ms [list after idle [info level 0]]
}
proc run {} {every 10000 {now; show0} }
proc stop {} {foreach id [after info] {after cancel $id}; }
### Test+Debug:
proc ? {} { help }
proc help {} {
puts "argv0 : $::argv0"
puts "argv : $::argv"
puts "tcl/tk: $::tcl_patchLevel / $::tk_patchLevel"
puts "now,t1:change time, x,y, show0,show1, e:exit"
}
proc t1 {} { set ::cs [clock scan {1987-12-31 13:14:15} -format {%Y-%m-%d %H:%M:%S}] }
proc x {} { show0; show1 }
proc y {} {
show0
show2 "D" "Formatting codes for date"
show2 "T" "Formatting codes for time"
}
proc e {} { exit }
### Main:
wm title . "$Prog(title) $Prog(version)"
puts "$Prog(title) $Prog(version)"
bind . { console show }
catch {console show} ;##
catch {wm withdraw .}
t1
#now
show0
#show1
show2 "D" "Formatting codes for date"
show2 "T" "Formatting codes for time"
### EOF ###
======
----
**Output**
======none
ClockDemo v0.05
--
clock seconds: 567951255 TimeDate: 1987-12-31 13:14:15
Formatting codes for date:
%B December Name of the month, full name, localized
%b Dec Name of the month, abbreviation, localized
%C 19 Century, Indo-Arabic numerals
%D 12/31/1987 Date, as in %m/%d/%Y
%d 31 Number of the day of the month, two decimal digits
%e 31 Number of the day of the month, one (with a leading blank) or two decimal digits
%G 1987 Four-digit year number for use with the week-based ISO8601 calendar
%g 87 Two-digit year number, for use with the week-based ISO8601 calendar
%h Dec Name of the month, as in %b
%J 2447161 Julian Day Number, since 1 January, 4713 BCE.
%j 365 Day of the year (001-366), three-digits
%m 12 Number of the month (01-12) with two digits
%N 12 Number of the month (1-12) one (with a leading blank) or two digits
%P pm Part of the day, am or pm, localized
%p PM Part of the day, AM or PM, localized
%U 52 Ordinal number of the week of the year (00-53). (obsolete)
%V 53 Number of the ISO8601 week as a two digit number (01-53).
%W 52 Week number (00-53) within the year
%x 12/31/1987 Date, localized
%Y 1987 Year, four digits (1938-2037)
%y 87 Year, two digits (1938-2037)
Formatting codes for time:
%+ Thu Dec 31 13:14:15 CET 1987 TimeDate, as in %a %b %e %H:%M:%S %Z %Y
%c Thu Dec 31 13:14:15 1987 Date and time of day, localized
%H 13 Hour of the day (00-23), on a 24-hour clock.
%I 01 Hour of the day (12-11), on a 12-hour clock.
%k 13 Hour of the day (00-23), one- or two-digits, 24-hour clock.
%l 1 Hour of the day (12-11), one- or two-digits, 12-hour clock.
%M 14 Number of the minute of the hour (00-59) with two digits.
%R 13:14 Time of the day, on a 24-hour clock, localized
%r 01:14:15 pm Time of the day, on a 12-hour clock, localized
%S 15 Second of the minute (00-59).
%s 567951255 Clockseconds as decimal integer
%T 13:14:15 Time, as in %H:%M:%S.
%X 13:14:15 Time, localized
======
----
**Remarks**
if 0 {
[MiHa] 2015-03-03 - It looks like there is no formatting code for the total minutes of the day (0-1440). <
> Same for seconds (0-86400). <
>
Some questions:
* Is there an easy way to format long strings to fit into table-columns ?<
>Well, more easy then using
** [Tktable] or html-tables
** or http://wiki.tcl.tk/28063%|%A crude, but working simple fmt.tcl (word wrap in long strings)%|% ?
** [Additional string functions]/Linebreak looks short and promising...
* What is the preferred way to convert the string-values for hours, minutes or seconds to integers ?<
>There are several "obvious ways" to do it, such as
** incr mm; incr mm -1;
** set x [[expr {$mm}]]
** format %u $mm
** and more, see [expr problems with int].
* All those work "most of the time", but give a surprising error for some values, e.g. "08" and "09".
}
<>Date and Time