Artifact
67f03ffc598bdf0bb6dc0c9d7058a3cab5879b6a:
Attachment "clock.tcl.patch" to
ticket [3475995fff]
added by
sebres
2012-01-19 17:58:42.
0000: 49 6e 64 65 78 3a 20 63 6c 6f 63 6b 2e 74 63 6c Index: clock.tcl
0010: 0d 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ..==============
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0050: 3d 3d 3d 3d 3d 0d 0a 2d 2d 2d 20 63 6c 6f 63 6b =====..--- clock
0060: 2e 74 63 6c 09 28 72 65 76 69 73 69 6f 6e 20 37 .tcl.(revision 7
0070: 38 29 0d 0a 2b 2b 2b 20 63 6c 6f 63 6b 2e 74 63 8)..+++ clock.tc
0080: 6c 09 28 77 6f 72 6b 69 6e 67 20 63 6f 70 79 29 l.(working copy)
0090: 0d 0a 40 40 20 2d 37 34 30 2c 37 20 2b 37 34 30 ..@@ -740,7 +740
00a0: 2c 37 20 40 40 0d 0a 20 20 20 20 20 23 20 52 65 ,7 @@.. # Re
00b0: 74 75 72 6e 20 65 69 74 68 65 72 20 74 68 65 20 turn either the
00c0: 65 72 72 6f 72 20 6f 72 20 74 68 65 20 70 72 6f error or the pro
00d0: 63 20 6e 61 6d 65 0a 20 0a 20 20 20 20 20 69 66 c name. . if
00e0: 20 7b 20 24 73 74 61 74 75 73 20 3d 3d 20 31 20 { $status == 1
00f0: 7d 20 7b 0a 2d 09 69 66 20 7b 20 5b 6c 69 6e 64 } {.-.if { [lind
0100: 65 78 20 5b 64 69 63 74 20 67 65 74 20 24 6f 70 ex [dict get $op
0110: 74 73 20 2d 65 72 72 6f 72 63 6f 64 65 5d 20 30 ts -errorcode] 0
0120: 5d 20 65 71 20 7b 63 6c 6f 63 6b 7d 20 7d 20 7b ] eq {clock} } {
0130: 0a 2b 09 69 66 20 7b 20 5b 6c 69 6e 64 65 78 20 .+.if { [lindex
0140: 5b 64 69 63 74 20 67 65 74 20 24 6f 70 74 73 20 [dict get $opts
0150: 2d 65 72 72 6f 72 63 6f 64 65 5d 20 30 5d 20 65 -errorcode] 0] e
0160: 71 20 7b 43 4c 4f 43 4b 7d 20 7d 20 7b 0a 20 09 q {CLOCK} } {. .
0170: 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 return -code
0180: 20 65 72 72 6f 72 20 24 72 65 73 75 6c 74 0a 20 error $result.
0190: 09 7d 20 65 6c 73 65 20 7b 0a 20 09 20 20 20 20 .} else {. .
01a0: 72 65 74 75 72 6e 20 2d 6f 70 74 69 6f 6e 73 20 return -options
01b0: 24 6f 70 74 73 20 24 72 65 73 75 6c 74 0a 40 40 $opts $result.@@
01c0: 20 2d 31 32 31 33 2c 37 20 2b 31 32 31 33 2c 37 -1213,7 +1213,7
01d0: 20 40 40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 @@..
01e0: 20 20 20 5c 22 24 63 6d 64 4e 61 6d 65 20 73 74 \"$cmdName st
01f0: 72 69 6e 67 5c 0a 20 20 20 20 20 20 20 20 20 20 ring\.
0200: 20 20 20 20 3f 2d 62 61 73 65 20 73 65 63 6f 6e ?-base secon
0210: 64 73 3f 5c 0a 20 20 20 20 20 20 20 20 20 20 20 ds?\.
0220: 20 20 20 3f 2d 66 6f 72 6d 61 74 20 73 74 72 69 ?-format stri
0230: 6e 67 3f 20 3f 2d 67 6d 74 20 62 6f 6f 6c 65 61 ng? ?-gmt boolea
0240: 6e 3f 5c 0a 2d 20 20 20 20 20 20 20 20 20 20 20 n?\.-
0250: 20 20 3f 2d 6c 6f 63 61 6c 65 20 4c 4f 43 41 4c ?-locale LOCAL
0260: 45 3f 20 3f 2d 74 69 6d 65 7a 6f 6e 65 20 5a 4f E? ?-timezone ZO
0270: 4e 45 3f 5c 22 22 0a 2b 20 20 20 20 20 20 20 20 NE?\"".+
0280: 20 20 20 20 20 3f 2d 6c 6f 63 61 6c 65 20 4c 4f ?-locale LO
0290: 43 41 4c 45 3f 20 3f 2d 74 69 6d 65 7a 6f 6e 65 CALE? ?-timezone
02a0: 20 5a 4f 4e 45 3f 20 3f 2d 76 61 6c 69 64 20 31 ZONE? ?-valid 1
02b0: 7c 30 3f 5c 22 22 0a 20 20 20 20 20 7d 0a 20 0a |0?\"". }. .
02c0: 20 20 20 20 20 23 20 53 65 74 20 64 65 66 61 75 # Set defau
02d0: 6c 74 73 0a 40 40 20 2d 31 32 32 34 2c 36 20 2b lts.@@ -1224,6 +
02e0: 31 32 32 34 2c 37 20 40 40 0d 0a 20 20 20 20 20 1224,7 @@..
02f0: 73 65 74 20 67 6d 74 20 30 0a 20 20 20 20 20 73 set gmt 0. s
0300: 65 74 20 6c 6f 63 61 6c 65 20 63 0a 20 20 20 20 et locale c.
0310: 20 73 65 74 20 74 69 6d 65 7a 6f 6e 65 20 5b 47 set timezone [G
0320: 65 74 53 79 73 74 65 6d 54 69 6d 65 5a 6f 6e 65 etSystemTimeZone
0330: 5d 0a 2b 20 20 20 20 73 65 74 20 76 61 6c 69 64 ].+ set valid
0340: 61 74 65 20 31 0a 20 0a 20 20 20 20 20 23 20 50 ate 1. . # P
0350: 69 63 6b 20 75 70 20 63 6f 6d 6d 61 6e 64 20 6c ick up command l
0360: 69 6e 65 20 6f 70 74 69 6f 6e 73 2e 0a 20 0a 40 ine options.. .@
0370: 40 20 2d 31 32 34 35 2c 36 20 2b 31 32 34 36 2c @ -1245,6 +1246,
0380: 39 20 40 40 0d 0a 20 09 20 20 20 20 2d 74 20 2d 9 @@.. . -t -
0390: 20 2d 74 69 20 2d 20 2d 74 69 6d 20 2d 20 2d 74 -ti - -tim - -t
03a0: 69 6d 65 20 2d 20 2d 74 69 6d 65 7a 20 2d 20 2d ime - -timez - -
03b0: 74 69 6d 65 7a 6f 20 2d 20 2d 74 69 6d 65 7a 6f timezo - -timezo
03c0: 6e 20 2d 20 2d 74 69 6d 65 7a 6f 6e 65 20 7b 0a n - -timezone {.
03d0: 20 09 09 73 65 74 20 74 69 6d 65 7a 6f 6e 65 20 ..set timezone
03e0: 24 76 61 6c 75 65 0a 20 09 20 20 20 20 7d 0a 2b $value. . }.+
03f0: 09 20 20 20 20 2d 76 20 2d 20 2d 76 61 6c 69 64 . -v - -valid
0400: 20 7b 0a 2b 09 09 73 65 74 20 76 61 6c 69 64 61 {.+..set valida
0410: 74 65 20 24 76 61 6c 75 65 0a 2b 09 20 20 20 20 te $value.+.
0420: 7d 0a 20 09 20 20 20 20 64 65 66 61 75 6c 74 20 }. . default
0430: 7b 0a 20 09 09 72 65 74 75 72 6e 20 2d 63 6f 64 {. ..return -cod
0440: 65 20 65 72 72 6f 72 20 5c 0a 20 09 09 20 20 20 e error \. ..
0450: 20 2d 65 72 72 6f 72 63 6f 64 65 20 5b 6c 69 73 -errorcode [lis
0460: 74 20 43 4c 4f 43 4b 20 62 61 64 53 77 69 74 63 t CLOCK badSwitc
0470: 68 20 24 66 6c 61 67 5d 20 5c 0a 40 40 20 2d 31 h $flag] \.@@ -1
0480: 32 38 33 2c 37 20 2b 31 32 38 37 2c 37 20 40 40 283,7 +1287,7 @@
0490: 0d 0a 20 09 09 22 6c 65 67 61 63 79 20 5c 5b 63 .. .."legacy \[c
04a0: 6c 6f 63 6b 20 73 63 61 6e 5c 5d 20 64 6f 65 73 lock scan\] does
04b0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 2d 6c 6f not support -lo
04c0: 63 61 6c 65 22 0a 20 0a 20 09 7d 0a 2d 09 72 65 cale". . .}.-.re
04d0: 74 75 72 6e 20 5b 46 72 65 65 53 63 61 6e 20 24 turn [FreeScan $
04e0: 73 74 72 69 6e 67 20 24 62 61 73 65 20 24 74 69 string $base $ti
04f0: 6d 65 7a 6f 6e 65 20 24 6c 6f 63 61 6c 65 5d 0a mezone $locale].
0500: 2b 09 72 65 74 75 72 6e 20 5b 46 72 65 65 53 63 +.return [FreeSc
0510: 61 6e 20 24 73 74 72 69 6e 67 20 24 62 61 73 65 an $string $base
0520: 20 24 74 69 6d 65 7a 6f 6e 65 20 24 6c 6f 63 61 $timezone $loca
0530: 6c 65 20 24 76 61 6c 69 64 61 74 65 5d 0a 20 20 le $validate].
0540: 20 20 20 7d 0a 20 0a 20 20 20 20 20 23 20 43 68 }. . # Ch
0550: 61 6e 67 65 20 6c 6f 63 61 6c 65 20 69 66 20 61 ange locale if a
0560: 20 66 72 65 73 68 20 6c 6f 63 61 6c 65 20 68 61 fresh locale ha
0570: 73 20 62 65 65 6e 20 67 69 76 65 6e 20 6f 6e 20 s been given on
0580: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 the command line
0590: 2e 0a 40 40 20 2d 31 32 39 35 2c 37 20 2b 31 32 ..@@ -1295,7 +12
05a0: 39 39 2c 37 20 40 40 0d 0a 20 09 23 20 4d 61 70 99,7 @@.. .# Map
05b0: 20 61 77 61 79 20 74 68 65 20 6c 6f 63 61 6c 65 away the locale
05c0: 2d 64 65 70 65 6e 64 65 6e 74 20 63 6f 6d 70 6f -dependent compo
05d0: 73 69 74 65 20 66 6f 72 6d 61 74 20 67 72 6f 75 site format grou
05e0: 70 73 0a 20 0a 20 09 73 65 74 20 73 63 61 6e 6e ps. . .set scann
05f0: 65 72 20 5b 50 61 72 73 65 43 6c 6f 63 6b 53 63 er [ParseClockSc
0600: 61 6e 46 6f 72 6d 61 74 20 24 66 6f 72 6d 61 74 anFormat $format
0610: 20 24 6c 6f 63 61 6c 65 5d 0a 2d 09 24 73 63 61 $locale].-.$sca
0620: 6e 6e 65 72 20 24 73 74 72 69 6e 67 20 24 62 61 nner $string $ba
0630: 73 65 20 24 74 69 6d 65 7a 6f 6e 65 0a 2b 09 24 se $timezone.+.$
0640: 73 63 61 6e 6e 65 72 20 24 73 74 72 69 6e 67 20 scanner $string
0650: 24 62 61 73 65 20 24 74 69 6d 65 7a 6f 6e 65 20 $base $timezone
0660: 24 76 61 6c 69 64 61 74 65 0a 20 0a 20 20 20 20 $validate. .
0670: 20 7d 20 72 65 73 75 6c 74 20 6f 70 74 73 5d 0a } result opts].
0680: 20 0a 40 40 20 2d 31 33 30 36 2c 31 31 20 2b 31 .@@ -1306,11 +1
0690: 33 31 30 2c 31 30 20 40 40 0d 0a 20 20 20 20 20 310,10 @@..
06a0: 7d 0a 20 0a 20 20 20 20 20 69 66 20 7b 20 24 73 }. . if { $s
06b0: 74 61 74 75 73 20 3d 3d 20 31 20 7d 20 7b 0a 2d tatus == 1 } {.-
06c0: 09 69 66 20 7b 20 5b 6c 69 6e 64 65 78 20 5b 64 .if { [lindex [d
06d0: 69 63 74 20 67 65 74 20 24 6f 70 74 73 20 2d 65 ict get $opts -e
06e0: 72 72 6f 72 63 6f 64 65 5d 20 30 5d 20 65 71 20 rrorcode] 0] eq
06f0: 7b 63 6c 6f 63 6b 7d 20 7d 20 7b 0a 2d 09 20 20 {clock} } {.-.
0700: 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 return -code e
0710: 72 72 6f 72 20 24 72 65 73 75 6c 74 0a 2d 09 7d rror $result.-.}
0720: 20 65 6c 73 65 20 7b 0a 2d 09 20 20 20 20 72 65 else {.-. re
0730: 74 75 72 6e 20 2d 6f 70 74 69 6f 6e 73 20 24 6f turn -options $o
0740: 70 74 73 20 24 72 65 73 75 6c 74 0a 2b 09 69 66 pts $result.+.if
0750: 20 7b 20 5b 6c 69 6e 64 65 78 20 5b 64 69 63 74 { [lindex [dict
0760: 20 67 65 74 20 24 6f 70 74 73 20 2d 65 72 72 6f get $opts -erro
0770: 72 63 6f 64 65 5d 20 30 5d 20 65 71 20 7b 43 4c rcode] 0] eq {CL
0780: 4f 43 4b 7d 20 7d 20 7b 0a 2b 09 20 20 64 69 63 OCK} } {.+. dic
0790: 74 20 75 6e 73 65 74 20 6f 70 74 73 20 2d 65 72 t unset opts -er
07a0: 72 6f 72 69 6e 66 6f 0a 20 09 7d 0a 2b 09 72 65 rorinfo. .}.+.re
07b0: 74 75 72 6e 20 2d 6f 70 74 69 6f 6e 73 20 24 6f turn -options $o
07c0: 70 74 73 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 pts -code error
07d0: 2d 6c 65 76 65 6c 20 31 20 24 72 65 73 75 6c 74 -level 1 $result
07e0: 0a 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 . } else {.
07f0: 09 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0a .return $result.
0800: 20 20 20 20 20 7d 0a 40 40 20 2d 31 33 33 35 2c }.@@ -1335,
0810: 37 20 2b 31 33 33 38 2c 37 20 40 40 0d 0a 20 23 7 +1338,7 @@.. #
0820: 0a 20 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . #-------------
0830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 0a 2d 70 72 6f ---------. .-pro
0870: 63 20 3a 3a 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a c ::tcl::clock::
0880: 46 72 65 65 53 63 61 6e 20 7b 20 73 74 72 69 6e FreeScan { strin
0890: 67 20 62 61 73 65 20 74 69 6d 65 7a 6f 6e 65 20 g base timezone
08a0: 6c 6f 63 61 6c 65 20 7d 20 7b 0a 2b 70 72 6f 63 locale } {.+proc
08b0: 20 3a 3a 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 46 ::tcl::clock::F
08c0: 72 65 65 53 63 61 6e 20 7b 20 73 74 72 69 6e 67 reeScan { string
08d0: 20 62 61 73 65 20 74 69 6d 65 7a 6f 6e 65 20 6c base timezone l
08e0: 6f 63 61 6c 65 20 7b 76 61 6c 69 64 61 74 65 20 ocale {validate
08f0: 31 7d 20 7d 20 7b 0a 20 0a 20 20 20 20 20 76 61 1} } {. . va
0900: 72 69 61 62 6c 65 20 54 5a 44 61 74 61 0a 20 0a riable TZData. .
0910: 40 40 20 2d 31 34 32 32 2c 36 20 2b 31 34 32 35 @@ -1422,6 +1425
0920: 2c 31 36 20 40 40 0d 0a 20 09 64 69 63 74 20 73 ,16 @@.. .dict s
0930: 65 74 20 64 61 74 65 20 73 65 63 6f 6e 64 4f 66 et date secondOf
0940: 44 61 79 20 30 0a 20 20 20 20 20 7d 0a 20 0a 2b Day 0. }. .+
0950: 20 20 20 20 69 66 20 7b 24 76 61 6c 69 64 61 74 if {$validat
0960: 65 7d 20 7b 0a 2b 09 69 66 20 7b 5b 63 61 74 63 e} {.+.if {[catc
0970: 68 20 7b 0a 2b 09 20 20 56 61 6c 69 64 44 61 74 h {.+. ValidDat
0980: 65 20 24 64 61 74 65 20 24 73 74 72 69 6e 67 0a e $date $string.
0990: 2b 09 7d 20 72 65 73 75 6c 74 20 6f 70 74 73 5d +.} result opts]
09a0: 7d 20 7b 0a 2b 09 20 20 69 66 20 7b 20 5b 6c 69 } {.+. if { [li
09b0: 6e 64 65 78 20 5b 64 69 63 74 20 67 65 74 20 24 ndex [dict get $
09c0: 6f 70 74 73 20 2d 65 72 72 6f 72 63 6f 64 65 5d opts -errorcode]
09d0: 20 30 5d 20 65 71 20 7b 43 4c 4f 43 4b 7d 20 7d 0] eq {CLOCK} }
09e0: 20 7b 0a 2b 09 20 20 20 20 64 69 63 74 20 75 6e {.+. dict un
09f0: 73 65 74 20 6f 70 74 73 20 2d 65 72 72 6f 72 69 set opts -errori
0a00: 6e 66 6f 0a 2b 09 20 20 7d 0a 2b 09 20 20 72 65 nfo.+. }.+. re
0a10: 74 75 72 6e 20 2d 6f 70 74 69 6f 6e 73 20 24 6f turn -options $o
0a20: 70 74 73 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 pts -code error
0a30: 2d 6c 65 76 65 6c 20 32 20 24 72 65 73 75 6c 74 -level 2 $result
0a40: 0a 2b 09 7d 0a 2b 20 20 20 20 7d 0a 20 20 20 20 .+.}.+ }.
0a50: 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20 6c dict set date l
0a60: 6f 63 61 6c 53 65 63 6f 6e 64 73 20 5c 0a 20 09 ocalSeconds \. .
0a70: 5b 65 78 70 72 20 7b 20 2d 32 31 30 38 36 36 38 [expr { -2108668
0a80: 30 33 32 30 30 0a 20 09 09 2b 20 28 20 38 36 34 03200. ..+ ( 864
0a90: 30 30 20 2a 20 77 69 64 65 28 5b 64 69 63 74 20 00 * wide([dict
0aa0: 67 65 74 20 24 64 61 74 65 20 6a 75 6c 69 61 6e get $date julian
0ab0: 44 61 79 5d 29 20 29 0a 40 40 20 2d 32 30 33 34 Day]) ).@@ -2034
0ac0: 2c 36 20 2b 32 30 34 37 2c 31 30 20 40 40 0d 0a ,6 +2047,10 @@..
0ad0: 20 09 20 20 20 20 73 65 74 20 64 61 74 65 20 5b . set date [
0ae0: 3a 3a 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 43 6f ::tcl::clock::Co
0af0: 6e 76 65 72 74 4c 6f 63 61 6c 54 6f 55 54 43 20 nvertLocalToUTC
0b00: 24 64 61 74 65 5b 73 65 74 20 64 61 74 65 20 7b $date[set date {
0b10: 7d 5d 20 5c 0a 20 09 09 09 20 20 24 54 5a 44 61 }] \. ... $TZDa
0b20: 74 61 28 24 74 69 6d 65 5a 6f 6e 65 29 20 5c 0a ta($timeZone) \.
0b30: 20 09 09 09 20 20 24 63 68 61 6e 67 65 6f 76 65 ... $changeove
0b40: 72 5d 0a 2b 09 0a 2b 09 20 20 20 20 69 66 20 7b r].+..+. if {
0b50: 24 76 61 6c 69 64 61 74 65 7d 20 7b 0a 2b 09 09 $validate} {.+..
0b60: 56 61 6c 69 64 44 61 74 65 20 24 64 61 74 65 20 ValidDate $date
0b70: 24 73 74 72 69 6e 67 0a 2b 09 20 20 20 20 7d 0a $string.+. }.
0b80: 20 09 7d 0a 20 20 20 20 20 7d 0a 20 0a 40 40 20 .}. }. .@@
0b90: 2d 32 30 34 31 2c 37 20 2b 32 30 35 38 2c 37 20 -2041,7 +2058,7
0ba0: 40 40 0d 0a 20 0a 20 20 20 20 20 61 70 70 65 6e @@.. . appen
0bb0: 64 20 70 72 6f 63 42 6f 64 79 20 7b 72 65 74 75 d procBody {retu
0bc0: 72 6e 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 rn [dict get $da
0bd0: 74 65 20 73 65 63 6f 6e 64 73 5d 7d 20 5c 6e 0a te seconds]} \n.
0be0: 20 0a 2d 20 20 20 20 70 72 6f 63 20 24 70 72 6f .- proc $pro
0bf0: 63 4e 61 6d 65 20 7b 20 73 74 72 69 6e 67 20 62 cName { string b
0c00: 61 73 65 54 69 6d 65 20 74 69 6d 65 5a 6f 6e 65 aseTime timeZone
0c10: 20 7d 20 24 70 72 6f 63 42 6f 64 79 0a 2b 20 20 } $procBody.+
0c20: 20 20 70 72 6f 63 20 24 70 72 6f 63 4e 61 6d 65 proc $procName
0c30: 20 7b 20 73 74 72 69 6e 67 20 62 61 73 65 54 69 { string baseTi
0c40: 6d 65 20 74 69 6d 65 5a 6f 6e 65 20 7b 76 61 6c me timeZone {val
0c50: 69 64 61 74 65 20 31 7d 20 7d 20 24 70 72 6f 63 idate 1} } $proc
0c60: 42 6f 64 79 0a 20 0a 20 20 20 20 20 23 20 70 75 Body. . # pu
0c70: 74 73 20 5b 6c 69 73 74 20 70 72 6f 63 20 24 70 ts [list proc $p
0c80: 72 6f 63 4e 61 6d 65 20 5b 6c 69 73 74 20 73 74 rocName [list st
0c90: 72 69 6e 67 20 62 61 73 65 54 69 6d 65 20 74 69 ring baseTime ti
0ca0: 6d 65 5a 6f 6e 65 5d 20 24 70 72 6f 63 42 6f 64 meZone] $procBod
0cb0: 79 5d 0a 20 0a 40 40 20 2d 33 30 36 38 2c 38 20 y]. .@@ -3068,8
0cc0: 2b 33 30 38 35 2c 31 33 20 40 40 0d 0a 20 23 2d +3085,13 @@.. #-
0cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d10: 2d 2d 2d 2d 2d 0a 20 0a 20 70 72 6f 63 20 3a 3a -----. . proc ::
0d20: 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 47 65 74 53 tcl::clock::GetS
0d30: 79 73 74 65 6d 54 69 6d 65 5a 6f 6e 65 20 7b 7d ystemTimeZone {}
0d40: 20 7b 0a 2d 0a 20 20 20 20 20 76 61 72 69 61 62 {.-. variab
0d50: 6c 65 20 43 61 63 68 65 64 53 79 73 74 65 6d 54 le CachedSystemT
0d60: 69 6d 65 5a 6f 6e 65 0a 2b 20 20 20 20 69 66 20 imeZone.+ if
0d70: 7b 20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 43 { [info exists C
0d80: 61 63 68 65 64 53 79 73 74 65 6d 54 69 6d 65 5a achedSystemTimeZ
0d90: 6f 6e 65 5d 20 7d 20 7b 0a 2b 20 20 20 20 20 20 one] } {.+
0da0: 23 23 20 69 66 20 6e 6f 74 20 73 77 69 74 63 68 ## if not switch
0db0: 65 64 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 69 ed to another ti
0dc0: 6d 65 20 7a 6f 6e 65 20 28 73 69 6d 70 6c 79 20 me zone (simply
0dd0: 63 68 65 63 6b 20 63 61 63 68 65 64 20 65 76 65 check cached eve
0de0: 72 79 20 31 30 20 6d 69 6e 75 74 65 73 29 20 3a ry 10 minutes) :
0df0: 0a 2b 20 20 20 20 20 20 69 66 20 7b 61 62 73 28 .+ if {abs(
0e00: 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 20 [clock seconds]
0e10: 2d 20 5b 6c 69 6e 64 65 78 20 24 43 61 63 68 65 - [lindex $Cache
0e20: 64 53 79 73 74 65 6d 54 69 6d 65 5a 6f 6e 65 20 dSystemTimeZone
0e30: 31 5d 29 20 3c 20 36 30 30 7d 20 7b 0a 2b 20 20 1]) < 600} {.+
0e40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 return [li
0e50: 6e 64 65 78 20 24 43 61 63 68 65 64 53 79 73 74 ndex $CachedSyst
0e60: 65 6d 54 69 6d 65 5a 6f 6e 65 20 30 5d 0a 2b 20 emTimeZone 0].+
0e70: 20 20 20 20 20 7d 0a 2b 20 20 20 20 7d 0a 20 20 }.+ }.
0e80: 20 20 20 76 61 72 69 61 62 6c 65 20 54 69 6d 65 variable Time
0e90: 5a 6f 6e 65 42 61 64 0a 20 0a 20 20 20 20 20 69 ZoneBad. . i
0ea0: 66 20 7b 5b 73 65 74 20 72 65 73 75 6c 74 20 5b f {[set result [
0eb0: 67 65 74 65 6e 76 20 54 43 4c 5f 54 5a 5d 5d 20 getenv TCL_TZ]]
0ec0: 6e 65 20 7b 7d 7d 20 7b 0a 40 40 20 2d 33 30 38 ne {}} {.@@ -308
0ed0: 30 2c 32 38 20 2b 33 31 30 32 2c 32 35 20 40 40 0,28 +3102,25 @@
0ee0: 0d 0a 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 .. if {![inf
0ef0: 6f 20 65 78 69 73 74 73 20 74 69 6d 65 7a 6f 6e o exists timezon
0f00: 65 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 23 e]} {. #
0f10: 20 43 61 63 68 65 20 74 68 65 20 74 69 6d 65 20 Cache the time
0f20: 7a 6f 6e 65 20 6f 6e 6c 79 20 69 66 20 69 74 20 zone only if it
0f30: 77 61 73 20 64 65 74 65 63 74 65 64 20 62 79 20 was detected by
0f40: 6f 6e 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 one of the.
0f50: 20 20 20 20 23 20 65 78 70 65 6e 73 69 76 65 20 # expensive
0f60: 6d 65 74 68 6f 64 73 2e 0a 2d 20 20 20 20 20 20 methods..-
0f70: 20 20 69 66 20 7b 20 5b 69 6e 66 6f 20 65 78 69 if { [info exi
0f80: 73 74 73 20 43 61 63 68 65 64 53 79 73 74 65 6d sts CachedSystem
0f90: 54 69 6d 65 5a 6f 6e 65 5d 20 7d 20 7b 0a 2d 20 TimeZone] } {.-
0fa0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74 set t
0fb0: 69 6d 65 7a 6f 6e 65 20 24 43 61 63 68 65 64 53 imezone $CachedS
0fc0: 79 73 74 65 6d 54 69 6d 65 5a 6f 6e 65 0a 2d 20 ystemTimeZone.-
0fd0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 } elseif
0fe0: 7b 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 { $::tcl_platfor
0ff0: 6d 28 70 6c 61 74 66 6f 72 6d 29 20 65 71 20 7b m(platform) eq {
1000: 77 69 6e 64 6f 77 73 7d 20 7d 20 7b 0a 2d 20 20 windows} } {.-
1010: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74 69 set ti
1020: 6d 65 7a 6f 6e 65 20 5b 47 75 65 73 73 57 69 6e mezone [GuessWin
1030: 64 6f 77 73 54 69 6d 65 5a 6f 6e 65 5d 0a 2d 20 dowsTimeZone].-
1040: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 } elseif
1050: 7b 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 2f { [file exists /
1060: 65 74 63 2f 6c 6f 63 61 6c 74 69 6d 65 5d 0a 2d etc/localtime].-
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1080: 20 20 20 26 26 20 21 5b 63 61 74 63 68 20 7b 52 && ![catch {R
1090: 65 61 64 5a 6f 6e 65 69 6e 66 6f 46 69 6c 65 20 eadZoneinfoFile
10a0: 5c 0a 2d 20 20 20 20 20 20 20 20 20 20 20 20 20 \.-
10b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10c0: 20 20 20 20 20 20 54 63 6c 2f 4c 6f 63 61 6c 74 Tcl/Localt
10d0: 69 6d 65 20 2f 65 74 63 2f 6c 6f 63 61 6c 74 69 ime /etc/localti
10e0: 6d 65 7d 5d 20 7d 20 7b 0a 2d 20 20 20 20 20 20 me}] } {.-
10f0: 20 20 20 20 20 20 73 65 74 20 74 69 6d 65 7a 6f set timezo
1100: 6e 65 20 3a 54 63 6c 2f 4c 6f 63 61 6c 74 69 6d ne :Tcl/Localtim
1110: 65 0a 2d 20 20 20 20 20 20 20 20 7d 20 65 6c 73 e.- } els
1120: 65 20 7b 0a 2d 20 20 20 20 20 20 20 20 20 20 20 e {.-
1130: 20 73 65 74 20 74 69 6d 65 7a 6f 6e 65 20 3a 6c set timezone :l
1140: 6f 63 61 6c 74 69 6d 65 0a 2d 20 20 20 20 20 20 ocaltime.-
1150: 20 20 7d 0a 2d 09 73 65 74 20 43 61 63 68 65 64 }.-.set Cached
1160: 53 79 73 74 65 6d 54 69 6d 65 5a 6f 6e 65 20 24 SystemTimeZone $
1170: 74 69 6d 65 7a 6f 6e 65 0a 2b 09 69 66 20 7b 20 timezone.+.if {
1180: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 $::tcl_platform(
1190: 70 6c 61 74 66 6f 72 6d 29 20 65 71 20 7b 77 69 platform) eq {wi
11a0: 6e 64 6f 77 73 7d 20 7d 20 7b 0a 2b 09 20 20 20 ndows} } {.+.
11b0: 20 73 65 74 20 74 69 6d 65 7a 6f 6e 65 20 5b 47 set timezone [G
11c0: 75 65 73 73 57 69 6e 64 6f 77 73 54 69 6d 65 5a uessWindowsTimeZ
11d0: 6f 6e 65 5d 0a 2b 09 7d 20 65 6c 73 65 69 66 20 one].+.} elseif
11e0: 7b 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 2f { [file exists /
11f0: 65 74 63 2f 6c 6f 63 61 6c 74 69 6d 65 5d 0a 2b etc/localtime].+
1200: 09 20 20 20 20 20 20 20 26 26 20 21 5b 63 61 74 . && ![cat
1210: 63 68 20 7b 52 65 61 64 5a 6f 6e 65 69 6e 66 6f ch {ReadZoneinfo
1220: 46 69 6c 65 20 5c 0a 2b 09 09 20 20 20 20 20 20 File \.+..
1230: 20 54 63 6c 2f 4c 6f 63 61 6c 74 69 6d 65 20 2f Tcl/Localtime /
1240: 65 74 63 2f 6c 6f 63 61 6c 74 69 6d 65 7d 5d 20 etc/localtime}]
1250: 7d 20 7b 0a 2b 09 20 20 20 20 73 65 74 20 74 69 } {.+. set ti
1260: 6d 65 7a 6f 6e 65 20 3a 54 63 6c 2f 4c 6f 63 61 mezone :Tcl/Loca
1270: 6c 74 69 6d 65 0a 2b 09 7d 20 65 6c 73 65 20 7b ltime.+.} else {
1280: 0a 2b 09 20 20 20 20 73 65 74 20 74 69 6d 65 7a .+. set timez
1290: 6f 6e 65 20 3a 6c 6f 63 61 6c 74 69 6d 65 0a 2b one :localtime.+
12a0: 09 7d 0a 20 20 20 20 20 7d 0a 20 20 20 20 20 69 .}. }. i
12b0: 66 20 7b 20 21 5b 64 69 63 74 20 65 78 69 73 74 f { ![dict exist
12c0: 73 20 24 54 69 6d 65 5a 6f 6e 65 42 61 64 20 24 s $TimeZoneBad $
12d0: 74 69 6d 65 7a 6f 6e 65 5d 20 7d 20 7b 0a 20 09 timezone] } {. .
12e0: 64 69 63 74 20 73 65 74 20 54 69 6d 65 5a 6f 6e dict set TimeZon
12f0: 65 42 61 64 20 24 74 69 6d 65 7a 6f 6e 65 20 5b eBad $timezone [
1300: 63 61 74 63 68 20 7b 53 65 74 75 70 54 69 6d 65 catch {SetupTime
1310: 5a 6f 6e 65 20 24 74 69 6d 65 7a 6f 6e 65 7d 5d Zone $timezone}]
1320: 0a 20 20 20 20 20 7d 0a 20 20 20 20 20 69 66 20 . }. if
1330: 7b 20 5b 64 69 63 74 20 67 65 74 20 24 54 69 6d { [dict get $Tim
1340: 65 5a 6f 6e 65 42 61 64 20 24 74 69 6d 65 7a 6f eZoneBad $timezo
1350: 6e 65 5d 20 7d 20 7b 0a 2d 09 72 65 74 75 72 6e ne] } {.-.return
1360: 20 3a 6c 6f 63 61 6c 74 69 6d 65 0a 2d 20 20 20 :localtime.-
1370: 20 7d 20 65 6c 73 65 20 7b 0a 2d 09 72 65 74 75 } else {.-.retu
1380: 72 6e 20 24 74 69 6d 65 7a 6f 6e 65 0a 2b 09 73 rn $timezone.+.s
1390: 65 74 20 74 69 6d 65 7a 6f 6e 65 20 3a 6c 6f 63 et timezone :loc
13a0: 61 6c 74 69 6d 65 0a 20 20 20 20 20 7d 0a 2d 0a altime. }.-.
13b0: 2b 20 20 20 20 23 23 20 63 61 63 68 65 20 28 73 + ## cache (s
13c0: 69 6d 70 6c 79 20 63 68 65 63 6b 20 63 61 63 68 imply check cach
13d0: 65 64 20 65 76 65 72 79 20 31 30 20 6d 69 6e 75 ed every 10 minu
13e0: 74 65 73 20 28 72 6f 75 6e 64 65 64 20 74 6f 20 tes (rounded to
13f0: 30 30 3a 31 30 3a 30 30 29 29 3a 0a 2b 20 20 20 00:10:00)):.+
1400: 20 73 65 74 20 43 61 63 68 65 64 53 79 73 74 65 set CachedSyste
1410: 6d 54 69 6d 65 5a 6f 6e 65 20 5b 6c 69 73 74 20 mTimeZone [list
1420: 24 74 69 6d 65 7a 6f 6e 65 20 5b 65 78 70 72 20 $timezone [expr
1430: 7b 5b 73 65 74 20 73 77 69 74 63 68 74 69 6d 65 {[set switchtime
1440: 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d [clock seconds]
1450: 5d 20 2d 20 24 73 77 69 74 63 68 74 69 6d 65 20 ] - $switchtime
1460: 25 20 36 30 30 7d 5d 5d 0a 2b 20 20 20 20 72 65 % 600}]].+ re
1470: 74 75 72 6e 20 24 74 69 6d 65 7a 6f 6e 65 0a 20 turn $timezone.
1480: 7d 0a 20 0a 20 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d }. . #----------
1490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 40 40 20 ------------.@@
14d0: 2d 34 36 39 31 2c 33 20 2b 34 37 31 30 2c 32 30 -4691,3 +4710,20
14e0: 36 20 40 40 0d 0a 20 20 20 20 20 49 6e 69 74 54 6 @@.. InitT
14f0: 5a 44 61 74 61 0a 20 0a 20 7d 0a 2b 0a 2b 0a 2b ZData. . }.+.+.+
1500: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d #---------------
1510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1540: 2d 2d 2d 2d 2d 2d 2d 0a 2b 23 20 5b 53 45 42 52 -------.+# [SEBR
1550: 45 53 5d 20 65 78 74 65 6e 73 69 6f 6e 3a 0a 2b ES] extension:.+
1560: 23 20 20 20 2d 20 76 61 6c 69 64 61 74 65 20 3a # - validate :
1570: 0a 2b 23 20 20 20 2d 20 63 72 65 61 74 65 20 64 .+# - create d
1580: 61 74 65 20 64 69 72 65 63 74 20 66 72 6f 6d 20 ate direct from
1590: 61 72 67 73 20 28 77 69 74 68 6f 75 74 20 70 61 args (without pa
15a0: 72 73 69 6e 67 20 73 74 72 69 6e 67 29 20 3a 0a rsing string) :.
15b0: 2b 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d +#--------------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 0a 2b 70 72 6f 63 --------.+.+proc
1600: 20 3a 3a 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 56 ::tcl::clock::V
1610: 61 6c 69 64 44 61 74 65 20 7b 64 61 74 65 20 73 alidDate {date s
1620: 74 72 69 6e 67 7d 20 7b 0a 2b 20 20 23 23 20 63 tring} {.+ ## c
1630: 68 65 63 6b 20 64 61 74 65 20 3a 0a 2b 20 20 69 heck date :.+ i
1640: 66 20 7b 5b 64 69 63 74 20 65 78 69 73 74 73 20 f {[dict exists
1650: 24 64 61 74 65 20 6d 6f 6e 74 68 5d 20 26 26 20 $date month] &&
1660: 5b 64 69 63 74 20 65 78 69 73 74 73 20 24 64 61 [dict exists $da
1670: 74 65 20 64 61 79 4f 66 4d 6f 6e 74 68 5d 7d 20 te dayOfMonth]}
1680: 7b 0a 2b 20 20 20 20 23 23 20 66 69 72 73 74 20 {.+ ## first
1690: 2d 20 6d 6f 6e 74 68 20 3a 0a 2b 20 20 20 20 69 - month :.+ i
16a0: 66 20 7b 20 5b 73 65 74 20 6d 6f 6e 74 68 20 5b f { [set month [
16b0: 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20 6d dict get $date m
16c0: 6f 6e 74 68 5d 5d 20 3e 20 31 32 20 7c 7c 20 24 onth]] > 12 || $
16d0: 6d 6f 6e 74 68 20 3c 20 31 20 7d 20 7b 0a 2b 20 month < 1 } {.+
16e0: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 return -cod
16f0: 65 20 65 72 72 6f 72 20 2d 65 72 72 6f 72 63 6f e error -errorco
1700: 64 65 20 5b 6c 69 73 74 20 43 4c 4f 43 4b 20 69 de [list CLOCK i
1710: 6e 76 61 6c 69 64 41 72 67 73 5d 20 22 75 6e 61 nvalidArgs] "una
1720: 62 6c 65 20 74 6f 20 63 6f 6e 76 65 72 74 20 64 ble to convert d
1730: 61 74 65 2d 74 69 6d 65 20 73 74 72 69 6e 67 20 ate-time string
1740: 5c 22 24 73 74 72 69 6e 67 5c 22 3a 20 69 6e 76 \"$string\": inv
1750: 61 6c 69 64 20 6d 6f 6e 74 68 22 0a 2b 20 20 20 alid month".+
1760: 20 7d 0a 2b 20 20 20 20 23 23 20 62 79 20 66 65 }.+ ## by fe
1770: 62 72 75 61 72 79 20 63 68 65 63 6b 20 6c 65 61 bruary check lea
1780: 70 20 79 65 61 72 20 3a 0a 2b 20 20 20 20 69 66 p year :.+ if
1790: 20 7b 24 6d 6f 6e 74 68 20 3d 3d 20 32 7d 20 7b {$month == 2} {
17a0: 0a 2b 20 20 20 20 20 20 23 20 54 6f 64 6f 3a 20 .+ # Todo:
17b0: 63 6f 72 72 65 63 74 20 74 68 69 73 20 66 6f 72 correct this for
17c0: 20 6e 6f 74 20 67 72 69 67 6f 72 69 61 6e 3a 0a not grigorian:.
17d0: 2b 20 20 20 20 20 20 69 66 20 7b 21 5b 64 69 63 + if {![dic
17e0: 74 20 65 78 69 73 74 73 20 24 64 61 74 65 20 67 t exists $date g
17f0: 72 65 67 6f 72 69 61 6e 5d 7d 20 7b 0a 2b 20 20 regorian]} {.+
1800: 20 20 20 20 20 20 64 69 63 74 20 73 65 74 20 64 dict set d
1810: 61 74 65 20 67 72 65 67 6f 72 69 61 6e 20 31 0a ate gregorian 1.
1820: 2b 20 20 20 20 20 20 7d 0a 2b 20 20 20 20 20 20 + }.+
1830: 69 66 20 7b 20 5b 49 73 47 72 65 67 6f 72 69 61 if { [IsGregoria
1840: 6e 4c 65 61 70 59 65 61 72 20 24 64 61 74 65 5d nLeapYear $date]
1850: 20 7d 20 7b 0a 2b 20 20 20 20 20 20 20 20 76 61 } {.+ va
1860: 72 69 61 62 6c 65 20 44 61 79 73 49 6e 52 6f 6d riable DaysInRom
1870: 61 6e 4d 6f 6e 74 68 49 6e 4c 65 61 70 59 65 61 anMonthInLeapYea
1880: 72 0a 2b 20 20 20 20 20 20 20 20 73 65 74 20 68 r.+ set h
1890: 61 74 68 20 5b 6c 69 6e 64 65 78 20 24 44 61 79 ath [lindex $Day
18a0: 73 49 6e 52 6f 6d 61 6e 4d 6f 6e 74 68 49 6e 4c sInRomanMonthInL
18b0: 65 61 70 59 65 61 72 20 5b 65 78 70 72 20 7b 24 eapYear [expr {$
18c0: 6d 6f 6e 74 68 20 2d 20 31 7d 5d 5d 0a 2b 20 20 month - 1}]].+
18d0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 2b 20 20 } else {.+
18e0: 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 44 variable D
18f0: 61 79 73 49 6e 52 6f 6d 61 6e 4d 6f 6e 74 68 49 aysInRomanMonthI
1900: 6e 43 6f 6d 6d 6f 6e 59 65 61 72 0a 2b 20 20 20 nCommonYear.+
1910: 20 20 20 20 20 73 65 74 20 68 61 74 68 20 5b 6c set hath [l
1920: 69 6e 64 65 78 20 24 44 61 79 73 49 6e 52 6f 6d index $DaysInRom
1930: 61 6e 4d 6f 6e 74 68 49 6e 43 6f 6d 6d 6f 6e 59 anMonthInCommonY
1940: 65 61 72 20 5b 65 78 70 72 20 7b 24 6d 6f 6e 74 ear [expr {$mont
1950: 68 20 2d 20 31 7d 5d 5d 0a 2b 20 20 20 20 20 20 h - 1}]].+
1960: 7d 0a 2b 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a }.+ } else {.
1970: 2b 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 + variable
1980: 44 61 79 73 49 6e 52 6f 6d 61 6e 4d 6f 6e 74 68 DaysInRomanMonth
1990: 49 6e 43 6f 6d 6d 6f 6e 59 65 61 72 0a 2b 20 20 InCommonYear.+
19a0: 20 20 20 20 73 65 74 20 68 61 74 68 20 5b 6c 69 set hath [li
19b0: 6e 64 65 78 20 24 44 61 79 73 49 6e 52 6f 6d 61 ndex $DaysInRoma
19c0: 6e 4d 6f 6e 74 68 49 6e 43 6f 6d 6d 6f 6e 59 65 nMonthInCommonYe
19d0: 61 72 20 5b 65 78 70 72 20 7b 24 6d 6f 6e 74 68 ar [expr {$month
19e0: 20 2d 20 31 7d 5d 5d 0a 2b 20 20 20 20 7d 0a 2b - 1}]].+ }.+
19f0: 20 20 20 20 23 23 20 63 68 65 63 6b 20 64 61 79 ## check day
1a00: 20 69 6e 20 6d 6f 6e 74 68 20 3a 0a 2b 20 20 20 in month :.+
1a10: 20 69 66 20 7b 20 5b 73 65 74 20 64 61 79 20 5b if { [set day [
1a20: 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20 64 dict get $date d
1a30: 61 79 4f 66 4d 6f 6e 74 68 5d 5d 20 3e 20 24 68 ayOfMonth]] > $h
1a40: 61 74 68 20 7c 7c 20 24 64 61 79 20 3c 20 31 20 ath || $day < 1
1a50: 7d 20 7b 0a 2b 20 20 20 20 20 20 72 65 74 75 72 } {.+ retur
1a60: 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 2d 65 n -code error -e
1a70: 72 72 6f 72 63 6f 64 65 20 5b 6c 69 73 74 20 43 rrorcode [list C
1a80: 4c 4f 43 4b 20 69 6e 76 61 6c 69 64 41 72 67 73 LOCK invalidArgs
1a90: 5d 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6e ] "unable to con
1aa0: 76 65 72 74 20 64 61 74 65 2d 74 69 6d 65 20 73 vert date-time s
1ab0: 74 72 69 6e 67 20 5c 22 24 73 74 72 69 6e 67 5c tring \"$string\
1ac0: 22 3a 20 69 6e 76 61 6c 69 64 20 64 61 79 22 0a ": invalid day".
1ad0: 2b 20 20 20 20 7d 0a 2b 20 20 7d 0a 2b 20 20 23 + }.+ }.+ #
1ae0: 23 20 4f 6c 64 73 63 61 6e 20 63 6f 75 6c 64 20 # Oldscan could
1af0: 72 65 74 75 72 6e 73 20 73 65 63 6f 6e 64 4f 66 returns secondOf
1b00: 44 61 79 20 28 70 61 72 73 65 64 54 69 6d 65 29 Day (parsedTime)
1b10: 20 2d 31 20 62 79 20 69 6e 76 61 6c 69 64 20 74 -1 by invalid t
1b20: 69 6d 65 20 28 65 78 2e 3a 20 32 35 3a 30 30 3a ime (ex.: 25:00:
1b30: 30 30 29 20 3a 0a 2b 20 20 69 66 20 7b 5b 64 69 00) :.+ if {[di
1b40: 63 74 20 65 78 69 73 74 73 20 24 64 61 74 65 20 ct exists $date
1b50: 73 65 63 6f 6e 64 4f 66 44 61 79 5d 20 26 26 20 secondOfDay] &&
1b60: 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20 [dict get $date
1b70: 73 65 63 6f 6e 64 4f 66 44 61 79 5d 20 3d 3d 20 secondOfDay] ==
1b80: 2d 31 7d 20 7b 0a 2b 20 20 20 20 72 65 74 75 72 -1} {.+ retur
1b90: 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 2d 65 n -code error -e
1ba0: 72 72 6f 72 63 6f 64 65 20 5b 6c 69 73 74 20 43 rrorcode [list C
1bb0: 4c 4f 43 4b 20 69 6e 76 61 6c 69 64 41 72 67 73 LOCK invalidArgs
1bc0: 5d 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6e ] "unable to con
1bd0: 76 65 72 74 20 64 61 74 65 2d 74 69 6d 65 20 73 vert date-time s
1be0: 74 72 69 6e 67 20 5c 22 24 73 74 72 69 6e 67 5c tring \"$string\
1bf0: 22 3a 20 69 6e 76 61 6c 69 64 20 74 69 6d 65 22 ": invalid time"
1c00: 0a 2b 20 20 7d 0a 2b 20 20 23 23 20 63 68 65 63 .+ }.+ ## chec
1c10: 6b 20 74 69 6d 65 20 28 30 30 3a 30 30 3a 30 30 k time (00:00:00
1c20: 20 2d 20 32 33 3a 35 39 3a 35 39 20 6f 72 20 30 - 23:59:59 or 0
1c30: 30 3a 30 30 3a 30 30 5b 61 70 5d 6d 20 2d 20 31 0:00:00[ap]m - 1
1c40: 32 3a 30 30 3a 30 30 5b 61 70 5d 6d 29 20 3a 0a 2:00:00[ap]m) :.
1c50: 2b 20 20 69 66 20 7b 5b 64 69 63 74 20 65 78 69 + if {[dict exi
1c60: 73 74 73 20 24 64 61 74 65 20 68 6f 75 72 5d 7d sts $date hour]}
1c70: 20 7b 0a 2b 20 20 20 20 69 66 20 7b 5b 73 65 74 {.+ if {[set
1c80: 20 76 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 v [dict get $da
1c90: 74 65 20 68 6f 75 72 5d 5d 20 3c 20 30 20 7c 7c te hour]] < 0 ||
1ca0: 20 24 76 20 3e 20 32 33 7d 20 7b 0a 2b 20 20 20 $v > 23} {.+
1cb0: 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 return -code
1cc0: 65 72 72 6f 72 20 2d 65 72 72 6f 72 63 6f 64 65 error -errorcode
1cd0: 20 5b 6c 69 73 74 20 43 4c 4f 43 4b 20 69 6e 76 [list CLOCK inv
1ce0: 61 6c 69 64 41 72 67 73 5d 20 22 75 6e 61 62 6c alidArgs] "unabl
1cf0: 65 20 74 6f 20 63 6f 6e 76 65 72 74 20 64 61 74 e to convert dat
1d00: 65 2d 74 69 6d 65 20 73 74 72 69 6e 67 20 5c 22 e-time string \"
1d10: 24 73 74 72 69 6e 67 5c 22 3a 20 69 6e 76 61 6c $string\": inval
1d20: 69 64 20 74 69 6d 65 20 28 68 6f 75 72 29 22 0a id time (hour)".
1d30: 2b 20 20 20 20 7d 0a 2b 20 20 20 20 69 66 20 7b + }.+ if {
1d40: 5b 64 69 63 74 20 65 78 69 73 74 73 20 24 64 61 [dict exists $da
1d50: 74 65 20 61 6d 50 6d 49 6e 64 69 63 61 74 6f 72 te amPmIndicator
1d60: 5d 20 26 26 20 24 76 20 3e 20 31 32 7d 20 7b 0a ] && $v > 12} {.
1d70: 2b 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63 + return -c
1d80: 6f 64 65 20 65 72 72 6f 72 20 2d 65 72 72 6f 72 ode error -error
1d90: 63 6f 64 65 20 5b 6c 69 73 74 20 43 4c 4f 43 4b code [list CLOCK
1da0: 20 69 6e 76 61 6c 69 64 41 72 67 73 5d 20 22 75 invalidArgs] "u
1db0: 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 76 65 72 74 nable to convert
1dc0: 20 64 61 74 65 2d 74 69 6d 65 20 73 74 72 69 6e date-time strin
1dd0: 67 20 5c 22 24 73 74 72 69 6e 67 5c 22 3a 20 69 g \"$string\": i
1de0: 6e 76 61 6c 69 64 20 74 69 6d 65 20 28 68 6f 75 nvalid time (hou
1df0: 72 2f 61 6d 3a 70 6d 29 22 0a 2b 20 20 20 20 7d r/am:pm)".+ }
1e00: 0a 2b 20 20 7d 0a 2b 20 20 69 66 20 7b 5b 64 69 .+ }.+ if {[di
1e10: 63 74 20 65 78 69 73 74 73 20 24 64 61 74 65 20 ct exists $date
1e20: 6d 69 6e 75 74 65 5d 20 26 26 20 28 5b 73 65 74 minute] && ([set
1e30: 20 76 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 v [dict get $da
1e40: 74 65 20 6d 69 6e 75 74 65 5d 5d 20 3c 20 30 20 te minute]] < 0
1e50: 7c 7c 20 24 76 20 3e 20 35 39 29 7d 20 7b 0a 2b || $v > 59)} {.+
1e60: 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 return -code
1e70: 20 65 72 72 6f 72 20 2d 65 72 72 6f 72 63 6f 64 error -errorcod
1e80: 65 20 5b 6c 69 73 74 20 43 4c 4f 43 4b 20 69 6e e [list CLOCK in
1e90: 76 61 6c 69 64 41 72 67 73 5d 20 22 75 6e 61 62 validArgs] "unab
1ea0: 6c 65 20 74 6f 20 63 6f 6e 76 65 72 74 20 64 61 le to convert da
1eb0: 74 65 2d 74 69 6d 65 20 73 74 72 69 6e 67 20 5c te-time string \
1ec0: 22 24 73 74 72 69 6e 67 5c 22 3a 20 69 6e 76 61 "$string\": inva
1ed0: 6c 69 64 20 74 69 6d 65 20 28 6d 69 6e 75 74 65 lid time (minute
1ee0: 29 22 0a 2b 20 20 7d 0a 2b 20 20 69 66 20 7b 5b )".+ }.+ if {[
1ef0: 64 69 63 74 20 65 78 69 73 74 73 20 24 64 61 74 dict exists $dat
1f00: 65 20 73 65 63 6f 6e 64 5d 20 26 26 20 28 5b 73 e second] && ([s
1f10: 65 74 20 76 20 5b 64 69 63 74 20 67 65 74 20 24 et v [dict get $
1f20: 64 61 74 65 20 73 65 63 6f 6e 64 5d 5d 20 3c 20 date second]] <
1f30: 30 20 7c 7c 20 24 76 20 3e 20 35 39 29 7d 20 7b 0 || $v > 59)} {
1f40: 0a 2b 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f .+ return -co
1f50: 64 65 20 65 72 72 6f 72 20 2d 65 72 72 6f 72 63 de error -errorc
1f60: 6f 64 65 20 5b 6c 69 73 74 20 43 4c 4f 43 4b 20 ode [list CLOCK
1f70: 69 6e 76 61 6c 69 64 41 72 67 73 5d 20 22 75 6e invalidArgs] "un
1f80: 61 62 6c 65 20 74 6f 20 63 6f 6e 76 65 72 74 20 able to convert
1f90: 64 61 74 65 2d 74 69 6d 65 20 73 74 72 69 6e 67 date-time string
1fa0: 20 5c 22 24 73 74 72 69 6e 67 5c 22 3a 20 69 6e \"$string\": in
1fb0: 76 61 6c 69 64 20 74 69 6d 65 20 28 73 65 63 6f valid time (seco
1fc0: 6e 64 29 22 0a 2b 20 20 7d 0a 2b 7d 0a 2b 0a 2b nd)".+ }.+}.+.+
1fd0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d #---------------
1fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2010: 2d 2d 2d 2d 2d 2d 2d 0a 2b 0a 2b 70 72 6f 63 20 -------.+.+proc
2020: 3a 3a 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 4d 61 ::tcl::clock::Ma
2030: 6b 65 44 61 74 65 20 7b 61 72 67 73 7d 20 7b 0a keDate {args} {.
2040: 2b 09 73 65 74 20 64 61 74 65 20 24 61 72 67 73 +.set date $args
2050: 5b 73 65 74 20 61 72 67 73 20 7b 7d 5d 0a 2b 09 [set args {}].+.
2060: 0a 2b 09 69 66 20 7b 21 5b 64 69 63 74 20 65 78 .+.if {![dict ex
2070: 69 73 74 73 20 24 64 61 74 65 20 62 61 73 65 54 ists $date baseT
2080: 69 6d 65 5d 7d 20 7b 0a 2b 09 09 73 65 74 20 62 ime]} {.+..set b
2090: 61 73 65 54 69 6d 65 20 5b 63 6c 6f 63 6b 20 73 aseTime [clock s
20a0: 65 63 6f 6e 64 73 5d 0a 2b 09 7d 20 65 6c 73 65 econds].+.} else
20b0: 20 7b 0a 2b 09 09 73 65 74 20 62 61 73 65 54 69 {.+..set baseTi
20c0: 6d 65 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 me [dict get $da
20d0: 74 65 20 62 61 73 65 54 69 6d 65 5d 0a 2b 09 7d te baseTime].+.}
20e0: 0a 2b 0a 2b 09 73 65 74 20 63 68 61 6e 67 65 6f .+.+.set changeo
20f0: 76 65 72 20 32 33 36 31 32 32 32 3b 20 23 5b 74 ver 2361222; #[t
2100: 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 6d 63 20 47 52 cl::clock::mc GR
2110: 45 47 4f 52 49 41 4e 5f 43 48 41 4e 47 45 5f 44 EGORIAN_CHANGE_D
2120: 41 54 45 5d 0a 2b 09 73 65 74 20 74 7a 20 7b 7d ATE].+.set tz {}
2130: 0a 2b 09 69 66 20 7b 5b 64 69 63 74 20 65 78 69 .+.if {[dict exi
2140: 73 74 73 20 24 64 61 74 65 20 74 7a 4e 61 6d 65 sts $date tzName
2150: 5d 7d 20 7b 0a 2b 09 09 73 65 74 20 74 7a 20 5b ]} {.+..set tz [
2160: 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20 74 dict get $date t
2170: 7a 4e 61 6d 65 5d 0a 2b 09 09 69 66 20 7b 24 74 zName].+..if {$t
2180: 7a 20 3d 3d 20 7b 7d 7d 20 7b 0a 2b 09 09 09 73 z == {}} {.+...s
2190: 65 74 20 74 7a 20 5b 3a 3a 74 63 6c 3a 3a 63 6c et tz [::tcl::cl
21a0: 6f 63 6b 3a 3a 47 65 74 53 79 73 74 65 6d 54 69 ock::GetSystemTi
21b0: 6d 65 5a 6f 6e 65 5d 0a 2b 09 09 7d 20 65 6c 73 meZone].+..} els
21c0: 65 69 66 20 7b 24 74 7a 20 69 6e 20 7b 3a 55 54 eif {$tz in {:UT
21d0: 43 20 3a 47 4d 54 7d 7d 20 7b 0a 2b 09 09 09 73 C :GMT}} {.+...s
21e0: 65 74 20 74 7a 20 7b 7d 0a 2b 09 09 7d 0a 2b 09 et tz {}.+..}.+.
21f0: 09 69 66 20 7b 24 74 7a 20 21 3d 20 7b 7d 7d 20 .if {$tz != {}}
2200: 7b 0a 2b 09 09 09 76 61 72 69 61 62 6c 65 20 54 {.+...variable T
2210: 5a 44 61 74 61 0a 2b 09 09 09 69 66 20 7b 21 5b ZData.+...if {![
2220: 69 6e 66 6f 20 65 78 69 73 74 73 20 54 5a 44 61 info exists TZDa
2230: 74 61 28 24 74 7a 29 5d 7d 20 7b 0a 2b 09 09 09 ta($tz)]} {.+...
2240: 09 3a 3a 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 53 .::tcl::clock::S
2250: 65 74 75 70 54 69 6d 65 5a 6f 6e 65 20 24 74 7a etupTimeZone $tz
2260: 0a 2b 09 09 09 7d 0a 2b 09 09 7d 0a 2b 09 7d 0a .+...}.+..}.+.}.
2270: 2b 0a 2b 09 64 69 63 74 20 73 65 74 20 64 61 74 +.+.dict set dat
2280: 65 20 65 72 61 20 43 45 0a 2b 09 23 20 4a 75 6c e era CE.+.# Jul
2290: 69 61 6e 20 44 61 79 20 4e 75 6d 62 65 72 20 66 ian Day Number f
22a0: 72 6f 6d 20 74 68 65 20 66 69 65 6c 64 73 2e 0a rom the fields..
22b0: 2b 09 69 66 20 7b 21 5b 64 69 63 74 20 65 78 69 +.if {![dict exi
22c0: 73 74 73 20 24 64 61 74 65 20 79 65 61 72 5d 7d sts $date year]}
22d0: 20 7b 0a 2b 09 09 69 66 20 7b 21 5b 64 69 63 74 {.+..if {![dict
22e0: 20 65 78 69 73 74 73 20 24 64 61 74 65 20 79 65 exists $date ye
22f0: 61 72 4f 66 43 65 6e 74 75 72 79 5d 7d 20 7b 0a arOfCentury]} {.
2300: 2b 09 09 09 73 65 74 20 64 61 74 65 20 5b 41 73 +...set date [As
2310: 73 69 67 6e 42 61 73 65 59 65 61 72 20 24 64 61 signBaseYear $da
2320: 74 65 5b 73 65 74 20 64 61 74 65 20 7b 7d 5d 20 te[set date {}]
2330: 5c 0a 2b 09 09 09 09 24 62 61 73 65 54 69 6d 65 \.+....$baseTime
2340: 20 24 74 7a 20 24 63 68 61 6e 67 65 6f 76 65 72 $tz $changeover
2350: 5d 0a 2b 09 09 7d 20 65 6c 73 65 20 7b 0a 2b 09 ].+..} else {.+.
2360: 09 09 73 65 74 20 64 61 74 65 20 5b 49 6e 74 65 ..set date [Inte
2370: 72 70 72 65 74 54 77 6f 44 69 67 69 74 59 65 61 rpretTwoDigitYea
2380: 72 20 24 64 61 74 65 5b 73 65 74 20 64 61 74 65 r $date[set date
2390: 20 7b 7d 5d 20 24 62 61 73 65 54 69 6d 65 5d 0a {}] $baseTime].
23a0: 2b 09 09 7d 0a 2b 09 7d 0a 2b 09 69 66 20 7b 21 +..}.+.}.+.if {!
23b0: 5b 64 69 63 74 20 65 78 69 73 74 73 20 24 64 61 [dict exists $da
23c0: 74 65 20 6d 6f 6e 74 68 5d 7d 20 7b 0a 2b 09 09 te month]} {.+..
23d0: 73 65 74 20 64 61 74 65 20 5b 41 73 73 69 67 6e set date [Assign
23e0: 42 61 73 65 4d 6f 6e 74 68 20 24 64 61 74 65 5b BaseMonth $date[
23f0: 73 65 74 20 64 61 74 65 20 7b 7d 5d 20 5c 0a 2b set date {}] \.+
2400: 09 09 09 24 62 61 73 65 54 69 6d 65 20 24 74 7a ...$baseTime $tz
2410: 20 24 63 68 61 6e 67 65 6f 76 65 72 5d 0a 2b 09 $changeover].+.
2420: 7d 0a 2b 09 69 66 20 7b 21 5b 64 69 63 74 20 65 }.+.if {![dict e
2430: 78 69 73 74 73 20 24 64 61 74 65 20 64 61 79 4f xists $date dayO
2440: 66 4d 6f 6e 74 68 5d 7d 20 7b 0a 2b 09 09 76 61 fMonth]} {.+..va
2450: 72 69 61 62 6c 65 20 54 5a 44 61 74 61 0a 2b 09 riable TZData.+.
2460: 09 73 65 74 20 64 61 74 65 32 20 5b 47 65 74 44 .set date2 [GetD
2470: 61 74 65 46 69 65 6c 64 73 20 24 62 61 73 65 54 ateFields $baseT
2480: 69 6d 65 20 24 54 5a 44 61 74 61 28 24 74 7a 29 ime $TZData($tz)
2490: 20 24 63 68 61 6e 67 65 6f 76 65 72 5d 0a 2b 09 $changeover].+.
24a0: 09 64 69 63 74 20 73 65 74 20 64 61 74 65 20 64 .dict set date d
24b0: 61 79 4f 66 4d 6f 6e 74 68 20 5b 64 69 63 74 20 ayOfMonth [dict
24c0: 67 65 74 20 24 64 61 74 65 32 20 64 61 79 4f 66 get $date2 dayOf
24d0: 4d 6f 6e 74 68 5d 0a 2b 09 7d 0a 2b 09 69 66 20 Month].+.}.+.if
24e0: 7b 5b 63 61 74 63 68 20 7b 0a 2b 09 09 73 65 74 {[catch {.+..set
24f0: 20 64 61 74 65 20 5b 3a 3a 74 63 6c 3a 3a 63 6c date [::tcl::cl
2500: 6f 63 6b 3a 3a 47 65 74 4a 75 6c 69 61 6e 44 61 ock::GetJulianDa
2510: 79 46 72 6f 6d 45 72 61 59 65 61 72 4d 6f 6e 74 yFromEraYearMont
2520: 68 44 61 79 20 24 64 61 74 65 5b 73 65 74 20 64 hDay $date[set d
2530: 61 74 65 20 7b 7d 5d 20 24 63 68 61 6e 67 65 6f ate {}] $changeo
2540: 76 65 72 5d 0a 2b 09 7d 20 6d 73 67 5d 7d 20 7b ver].+.} msg]} {
2550: 0a 2b 09 09 72 65 74 75 72 6e 20 2d 63 6f 64 65 .+..return -code
2560: 20 65 72 72 6f 72 20 2d 65 72 72 6f 72 63 6f 64 error -errorcod
2570: 65 20 5b 6c 69 73 74 20 43 4c 4f 43 4b 20 69 6e e [list CLOCK in
2580: 76 61 6c 69 64 41 72 67 73 5d 20 24 6d 73 67 0a validArgs] $msg.
2590: 2b 09 7d 0a 2b 09 23 20 47 65 74 20 74 69 6d 65 +.}.+.# Get time
25a0: 20 6f 66 20 64 61 79 0a 2b 09 64 69 63 74 20 73 of day.+.dict s
25b0: 65 74 20 64 61 74 65 20 73 65 63 6f 6e 64 4f 66 et date secondOf
25c0: 44 61 79 20 5b 3a 3a 74 63 6c 3a 3a 63 6c 6f 63 Day [::tcl::cloc
25d0: 6b 3a 3a 49 6e 74 65 72 70 72 65 74 48 4d 53 20 k::InterpretHMS
25e0: 24 64 61 74 65 5d 0a 2b 09 23 20 41 73 73 65 6d $date].+.# Assem
25f0: 62 6c 65 20 73 65 63 6f 6e 64 73 2c 20 61 6e 64 ble seconds, and
2600: 20 63 6f 6e 76 65 72 74 20 6c 6f 63 61 6c 20 6e convert local n
2610: 6f 6d 69 6e 61 6c 20 74 69 6d 65 20 74 6f 20 55 ominal time to U
2620: 54 43 2e 0a 2b 09 69 66 20 7b 20 5b 64 69 63 74 TC..+.if { [dict
2630: 20 67 65 74 20 24 64 61 74 65 20 6a 75 6c 69 61 get $date julia
2640: 6e 44 61 79 5d 20 3e 20 35 33 37 33 34 38 34 20 nDay] > 5373484
2650: 7d 20 7b 0a 2b 09 09 72 65 74 75 72 6e 20 2d 63 } {.+..return -c
2660: 6f 64 65 20 65 72 72 6f 72 20 2d 65 72 72 6f 72 ode error -error
2670: 63 6f 64 65 20 5b 6c 69 73 74 20 43 4c 4f 43 4b code [list CLOCK
2680: 20 64 61 74 65 54 6f 6f 4c 61 72 67 65 5d 20 22 dateTooLarge] "
2690: 72 65 71 75 65 73 74 65 64 20 64 61 74 65 20 74 requested date t
26a0: 6f 6f 20 6c 61 72 67 65 20 74 6f 20 72 65 70 72 oo large to repr
26b0: 65 73 65 6e 74 22 0a 2b 09 7d 0a 2b 09 64 69 63 esent".+.}.+.dic
26c0: 74 20 73 65 74 20 64 61 74 65 20 6c 6f 63 61 6c t set date local
26d0: 53 65 63 6f 6e 64 73 20 5b 73 65 74 20 73 65 63 Seconds [set sec
26e0: 73 20 5b 65 78 70 72 20 7b 20 2d 32 31 30 38 36 s [expr { -21086
26f0: 36 38 30 33 32 30 30 0a 2b 09 09 2b 20 28 20 38 6803200.+..+ ( 8
2700: 36 34 30 30 20 2a 20 77 69 64 65 28 5b 64 69 63 6400 * wide([dic
2710: 74 20 67 65 74 20 24 64 61 74 65 20 6a 75 6c 69 t get $date juli
2720: 61 6e 44 61 79 5d 29 20 29 0a 2b 09 09 2b 20 5b anDay]) ).+..+ [
2730: 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20 73 dict get $date s
2740: 65 63 6f 6e 64 4f 66 44 61 79 5d 20 7d 5d 5d 0a econdOfDay] }]].
2750: 2b 09 69 66 20 7b 24 74 7a 20 21 3d 20 7b 7d 7d +.if {$tz != {}}
2760: 20 7b 0a 2b 09 09 73 65 74 20 64 61 74 65 20 5b {.+..set date [
2770: 3a 3a 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 43 6f ::tcl::clock::Co
2780: 6e 76 65 72 74 4c 6f 63 61 6c 54 6f 55 54 43 20 nvertLocalToUTC
2790: 24 64 61 74 65 5b 73 65 74 20 64 61 74 65 20 7b $date[set date {
27a0: 7d 5d 20 24 54 5a 44 61 74 61 28 24 74 7a 29 20 }] $TZData($tz)
27b0: 24 63 68 61 6e 67 65 6f 76 65 72 5d 0a 2b 09 09 $changeover].+..
27c0: 72 65 74 75 72 6e 20 24 64 61 74 65 0a 2b 09 7d return $date.+.}
27d0: 0a 2b 09 23 20 73 65 74 20 73 65 63 6f 6e 64 73 .+.# set seconds
27e0: 20 74 6f 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 to localSeconds
27f0: 0a 2b 09 64 69 63 74 20 73 65 74 20 64 61 74 65 .+.dict set date
2800: 20 73 65 63 6f 6e 64 73 20 24 73 65 63 73 0a 2b seconds $secs.+
2810: 09 72 65 74 75 72 6e 20 24 64 61 74 65 0a 2b 7d .return $date.+}
2820: 0a 2b 0a 2b 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .+.+#-----------
2830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 0a 2b 70 -----------.+.+p
2870: 72 6f 63 20 3a 3a 74 63 6c 3a 3a 63 6c 6f 63 6b roc ::tcl::clock
2880: 3a 3a 43 6f 6e 76 65 72 74 54 6f 53 65 63 6f 6e ::ConvertToSecon
2890: 64 73 20 7b 59 20 6d 20 64 20 48 20 4d 20 53 20 ds {Y m d H M S
28a0: 7b 74 7a 20 7b 7d 7d 7d 20 7b 0a 2b 09 73 65 74 {tz {}}} {.+.set
28b0: 20 64 61 74 65 20 5b 6c 69 73 74 20 5c 0a 2b 09 date [list \.+.
28c0: 09 79 65 61 72 20 24 59 20 5c 0a 2b 09 09 6d 6f .year $Y \.+..mo
28d0: 6e 74 68 20 24 6d 20 5c 0a 2b 09 09 64 61 79 4f nth $m \.+..dayO
28e0: 66 4d 6f 6e 74 68 20 24 64 20 5c 0a 2b 09 09 68 fMonth $d \.+..h
28f0: 6f 75 72 20 24 48 20 5c 0a 2b 09 09 6d 69 6e 75 our $H \.+..minu
2900: 74 65 20 24 4d 20 5c 0a 2b 09 09 73 65 63 6f 6e te $M \.+..secon
2910: 64 20 24 53 20 5c 0a 2b 09 5d 0a 2b 0a 2b 09 73 d $S \.+.].+.+.s
2920: 65 74 20 63 68 61 6e 67 65 6f 76 65 72 20 32 33 et changeover 23
2930: 36 31 32 32 32 3b 20 23 5b 74 63 6c 3a 3a 63 6c 61222; #[tcl::cl
2940: 6f 63 6b 3a 3a 6d 63 20 47 52 45 47 4f 52 49 41 ock::mc GREGORIA
2950: 4e 5f 43 48 41 4e 47 45 5f 44 41 54 45 5d 0a 2b N_CHANGE_DATE].+
2960: 09 69 66 20 7b 24 74 7a 20 3d 3d 20 7b 7d 7d 20 .if {$tz == {}}
2970: 7b 0a 2b 09 09 73 65 74 20 74 7a 20 5b 47 65 74 {.+..set tz [Get
2980: 53 79 73 74 65 6d 54 69 6d 65 5a 6f 6e 65 5d 0a SystemTimeZone].
2990: 2b 09 7d 20 65 6c 73 65 69 66 20 7b 24 74 7a 20 +.} elseif {$tz
29a0: 6e 69 20 7b 3a 55 54 43 20 3a 47 4d 54 7d 7d 20 ni {:UTC :GMT}}
29b0: 7b 0a 2b 09 09 76 61 72 69 61 62 6c 65 20 54 5a {.+..variable TZ
29c0: 44 61 74 61 0a 2b 09 09 69 66 20 7b 21 5b 69 6e Data.+..if {![in
29d0: 66 6f 20 65 78 69 73 74 73 20 54 5a 44 61 74 61 fo exists TZData
29e0: 28 24 74 7a 29 5d 7d 20 7b 0a 2b 09 09 09 53 65 ($tz)]} {.+...Se
29f0: 74 75 70 54 69 6d 65 5a 6f 6e 65 20 24 74 7a 0a tupTimeZone $tz.
2a00: 2b 09 09 7d 0a 2b 09 7d 20 65 6c 73 65 20 7b 0a +..}.+.} else {.
2a10: 2b 09 09 23 23 20 64 6f 6e 27 74 20 63 6f 6e 76 +..## don't conv
2a20: 65 72 74 20 69 6e 20 6c 6f 63 61 6c 20 3a 0a 2b ert in local :.+
2a30: 09 09 73 65 74 20 74 7a 20 7b 7d 0a 2b 09 7d 0a ..set tz {}.+.}.
2a40: 2b 0a 2b 09 64 69 63 74 20 73 65 74 20 64 61 74 +.+.dict set dat
2a50: 65 20 65 72 61 20 43 45 0a 2b 09 23 20 4a 75 6c e era CE.+.# Jul
2a60: 69 61 6e 20 44 61 79 20 4e 75 6d 62 65 72 20 66 ian Day Number f
2a70: 72 6f 6d 20 74 68 65 20 66 69 65 6c 64 73 2e 0a rom the fields..
2a80: 2b 09 69 66 20 7b 5b 63 61 74 63 68 20 7b 0a 2b +.if {[catch {.+
2a90: 09 09 73 65 74 20 64 61 74 65 20 5b 47 65 74 4a ..set date [GetJ
2aa0: 75 6c 69 61 6e 44 61 79 46 72 6f 6d 45 72 61 59 ulianDayFromEraY
2ab0: 65 61 72 4d 6f 6e 74 68 44 61 79 20 24 64 61 74 earMonthDay $dat
2ac0: 65 5b 73 65 74 20 64 61 74 65 20 7b 7d 5d 20 24 e[set date {}] $
2ad0: 63 68 61 6e 67 65 6f 76 65 72 5d 0a 2b 09 7d 20 changeover].+.}
2ae0: 6d 73 67 5d 7d 20 7b 0a 2b 09 09 72 65 74 75 72 msg]} {.+..retur
2af0: 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 2d 65 n -code error -e
2b00: 72 72 6f 72 63 6f 64 65 20 5b 6c 69 73 74 20 43 rrorcode [list C
2b10: 4c 4f 43 4b 20 69 6e 76 61 6c 69 64 41 72 67 73 LOCK invalidArgs
2b20: 5d 20 24 6d 73 67 0a 2b 09 7d 0a 2b 09 23 20 47 ] $msg.+.}.+.# G
2b30: 65 74 20 74 69 6d 65 20 6f 66 20 64 61 79 0a 2b et time of day.+
2b40: 09 64 69 63 74 20 73 65 74 20 64 61 74 65 20 73 .dict set date s
2b50: 65 63 6f 6e 64 4f 66 44 61 79 20 5b 49 6e 74 65 econdOfDay [Inte
2b60: 72 70 72 65 74 48 4d 53 20 24 64 61 74 65 5d 0a rpretHMS $date].
2b70: 2b 09 23 20 41 73 73 65 6d 62 6c 65 20 73 65 63 +.# Assemble sec
2b80: 6f 6e 64 73 2c 20 61 6e 64 20 63 6f 6e 76 65 72 onds, and conver
2b90: 74 20 6c 6f 63 61 6c 20 6e 6f 6d 69 6e 61 6c 20 t local nominal
2ba0: 74 69 6d 65 20 74 6f 20 55 54 43 2e 0a 2b 09 69 time to UTC..+.i
2bb0: 66 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64 f { [dict get $d
2bc0: 61 74 65 20 6a 75 6c 69 61 6e 44 61 79 5d 20 3e ate julianDay] >
2bd0: 20 35 33 37 33 34 38 34 20 7d 20 7b 0a 2b 09 09 5373484 } {.+..
2be0: 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 return -code err
2bf0: 6f 72 20 2d 65 72 72 6f 72 63 6f 64 65 20 5b 6c or -errorcode [l
2c00: 69 73 74 20 43 4c 4f 43 4b 20 64 61 74 65 54 6f ist CLOCK dateTo
2c10: 6f 4c 61 72 67 65 5d 20 22 72 65 71 75 65 73 74 oLarge] "request
2c20: 65 64 20 64 61 74 65 20 74 6f 6f 20 6c 61 72 67 ed date too larg
2c30: 65 20 74 6f 20 72 65 70 72 65 73 65 6e 74 22 0a e to represent".
2c40: 2b 09 7d 0a 2b 09 73 65 74 20 73 65 63 73 20 5b +.}.+.set secs [
2c50: 65 78 70 72 20 7b 20 2d 32 31 30 38 36 36 38 30 expr { -21086680
2c60: 33 32 30 30 0a 2b 09 09 2b 20 28 20 38 36 34 30 3200.+..+ ( 8640
2c70: 30 20 2a 20 77 69 64 65 28 5b 64 69 63 74 20 67 0 * wide([dict g
2c80: 65 74 20 24 64 61 74 65 20 6a 75 6c 69 61 6e 44 et $date julianD
2c90: 61 79 5d 29 20 29 0a 2b 09 09 2b 20 5b 64 69 63 ay]) ).+..+ [dic
2ca0: 74 20 67 65 74 20 24 64 61 74 65 20 73 65 63 6f t get $date seco
2cb0: 6e 64 4f 66 44 61 79 5d 20 7d 5d 0a 2b 09 69 66 ndOfDay] }].+.if
2cc0: 20 7b 24 74 7a 20 21 3d 20 7b 7d 7d 20 7b 0a 2b {$tz != {}} {.+
2cd0: 09 09 76 61 72 69 61 62 6c 65 20 54 5a 44 61 74 ..variable TZDat
2ce0: 61 0a 2b 09 09 64 69 63 74 20 73 65 74 20 64 61 a.+..dict set da
2cf0: 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 20 te localSeconds
2d00: 24 73 65 63 73 0a 2b 09 09 73 65 74 20 64 61 74 $secs.+..set dat
2d10: 65 20 5b 43 6f 6e 76 65 72 74 4c 6f 63 61 6c 54 e [ConvertLocalT
2d20: 6f 55 54 43 20 24 64 61 74 65 5b 73 65 74 20 64 oUTC $date[set d
2d30: 61 74 65 20 7b 7d 5d 20 24 54 5a 44 61 74 61 28 ate {}] $TZData(
2d40: 24 74 7a 29 20 24 63 68 61 6e 67 65 6f 76 65 72 $tz) $changeover
2d50: 5d 0a 2b 09 09 23 20 72 65 74 75 72 6e 20 75 74 ].+..# return ut
2d60: 63 20 3a 0a 2b 09 09 72 65 74 75 72 6e 20 5b 64 c :.+..return [d
2d70: 69 63 74 20 67 65 74 20 24 64 61 74 65 20 73 65 ict get $date se
2d80: 63 6f 6e 64 73 5d 0a 2b 09 7d 0a 2b 09 23 20 72 conds].+.}.+.# r
2d90: 65 74 75 72 6e 20 6c 6f 63 61 6c 53 65 63 6f 6e eturn localSecon
2da0: 64 73 20 28 61 6c 72 65 61 64 79 20 75 74 63 29 ds (already utc)
2db0: 0a 2b 09 72 65 74 75 72 6e 20 24 73 65 63 73 0a .+.return $secs.
2dc0: 2b 7d 0a 2b 0a 2b 23 2d 2d 2d 2d 2d 2d 2d 2d 2d +}.+.+#---------
2dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 0a -------------.+.
2e10: 2b 70 72 6f 63 20 3a 3a 74 63 6c 3a 3a 63 6c 6f +proc ::tcl::clo
2e20: 63 6b 3a 3a 43 6f 6e 76 65 72 74 46 72 6f 6d 53 ck::ConvertFromS
2e30: 65 63 6f 6e 64 73 20 7b 63 6c 6f 63 6b 20 7b 74 econds {clock {t
2e40: 7a 20 7b 7d 7d 7d 20 7b 0a 2b 09 76 61 72 69 61 z {}}} {.+.varia
2e50: 62 6c 65 20 54 5a 44 61 74 61 0a 2b 0a 2b 09 73 ble TZData.+.+.s
2e60: 65 74 20 63 68 61 6e 67 65 6f 76 65 72 20 32 33 et changeover 23
2e70: 36 31 32 32 32 3b 20 23 5b 74 63 6c 3a 3a 63 6c 61222; #[tcl::cl
2e80: 6f 63 6b 3a 3a 6d 63 20 47 52 45 47 4f 52 49 41 ock::mc GREGORIA
2e90: 4e 5f 43 48 41 4e 47 45 5f 44 41 54 45 5d 0a 2b N_CHANGE_DATE].+
2ea0: 09 69 66 20 7b 24 74 7a 20 3d 3d 20 7b 7d 7d 20 .if {$tz == {}}
2eb0: 7b 0a 2b 09 09 73 65 74 20 74 7a 20 5b 47 65 74 {.+..set tz [Get
2ec0: 53 79 73 74 65 6d 54 69 6d 65 5a 6f 6e 65 5d 0a SystemTimeZone].
2ed0: 2b 09 7d 20 65 6c 73 65 69 66 20 7b 24 74 7a 20 +.} elseif {$tz
2ee0: 6e 69 20 7b 3a 55 54 43 20 3a 47 4d 54 7d 7d 20 ni {:UTC :GMT}}
2ef0: 7b 0a 2b 09 09 69 66 20 7b 21 5b 69 6e 66 6f 20 {.+..if {![info
2f00: 65 78 69 73 74 73 20 54 5a 44 61 74 61 28 24 74 exists TZData($t
2f10: 7a 29 5d 7d 20 7b 0a 2b 09 09 09 53 65 74 75 70 z)]} {.+...Setup
2f20: 54 69 6d 65 5a 6f 6e 65 20 24 74 7a 0a 2b 09 09 TimeZone $tz.+..
2f30: 7d 0a 2b 09 7d 0a 2b 09 23 23 20 67 65 74 20 64 }.+.}.+.## get d
2f40: 61 74 65 20 76 61 72 20 3a 0a 2b 09 73 65 74 20 ate var :.+.set
2f50: 64 61 74 65 20 5b 47 65 74 44 61 74 65 46 69 65 date [GetDateFie
2f60: 6c 64 73 20 24 63 6c 6f 63 6b 20 24 54 5a 44 61 lds $clock $TZDa
2f70: 74 61 28 24 74 7a 29 20 24 63 68 61 6e 67 65 6f ta($tz) $changeo
2f80: 76 65 72 5d 0a 2b 09 73 65 74 20 74 69 6d 65 20 ver].+.set time
2f90: 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20 [dict get $date
2fa0: 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d 0a 2b 09 localSeconds].+.
2fb0: 23 23 20 72 65 74 75 72 6e 20 6c 69 73 74 20 59 ## return list Y
2fc0: 20 6d 20 64 20 48 20 4d 20 53 0a 2b 09 6c 69 73 m d H M S.+.lis
2fd0: 74 20 5c 0a 2b 09 09 5b 64 69 63 74 20 67 65 74 t \.+..[dict get
2fe0: 20 24 64 61 74 65 20 79 65 61 72 5d 20 5b 64 69 $date year] [di
2ff0: 63 74 20 67 65 74 20 24 64 61 74 65 20 6d 6f 6e ct get $date mon
3000: 74 68 5d 20 5b 64 69 63 74 20 67 65 74 20 24 64 th] [dict get $d
3010: 61 74 65 20 64 61 79 4f 66 4d 6f 6e 74 68 5d 20 ate dayOfMonth]
3020: 5c 0a 2b 09 09 5b 65 78 70 72 20 7b 24 74 69 6d \.+..[expr {$tim
3030: 65 20 2f 20 33 36 30 30 20 25 20 32 34 7d 5d 20 e / 3600 % 24}]
3040: 5b 65 78 70 72 20 7b 24 74 69 6d 65 20 2f 20 36 [expr {$time / 6
3050: 30 20 25 20 36 30 7d 5d 20 5b 65 78 70 72 20 7b 0 % 60}] [expr {
3060: 24 74 69 6d 65 20 25 20 36 30 7d 5d 0a 2b 7d 0a $time % 60}].+}.
3070: 2b 0a 2b 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d +.+#------------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ----------.