Attachment "clock.tcl.patch" to
ticket [3475995fff]
added by
sebres
2012-02-02 16:25:38.
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 31 34 2c 36 20 2b 31 34 2c 38 ..@@ -14,6 +14,8
00a0: 20 40 40 0d 0a 20 23 20 6f 66 20 74 68 69 73 20 @@.. # of this
00b0: 66 69 6c 65 2c 20 61 6e 64 20 66 6f 72 20 61 20 file, and for a
00c0: 44 49 53 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c DISCLAIMER OF AL
00d0: 4c 20 57 41 52 52 41 4e 54 49 45 53 2e 0a 20 23 L WARRANTIES.. #
00e0: 0a 20 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . #-------------
00f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 23 20 4d 6f 64 ---------.+# Mod
0130: 69 66 69 65 64 20 61 6e 64 20 6f 70 74 69 6d 69 ified and optimi
0140: 7a 65 64 20 32 30 31 32 20 62 79 20 53 65 72 67 zed 2012 by Serg
0150: 20 47 2e 20 42 72 65 73 74 65 72 20 28 73 65 62 G. Brester (seb
0160: 72 65 73 29 0a 2b 23 2d 2d 2d 2d 2d 2d 2d 2d 2d res).+#---------
0170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
01a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 0a -------------. .
01b0: 20 23 20 57 65 20 6d 75 73 74 20 68 61 76 65 20 # We must have
01c0: 6d 65 73 73 61 67 65 20 63 61 74 61 6c 6f 67 73 message catalogs
01d0: 20 74 68 61 74 20 73 75 70 70 6f 72 74 20 74 68 that support th
01e0: 65 20 72 6f 6f 74 20 6c 6f 63 61 6c 65 2c 20 61 e root locale, a
01f0: 6e 64 0a 20 23 20 77 65 20 6e 65 65 64 20 61 63 nd. # we need ac
0200: 63 65 73 73 20 74 6f 20 74 68 65 20 52 65 67 69 cess to the Regi
0210: 73 74 72 79 20 6f 6e 20 57 69 6e 64 6f 77 73 20 stry on Windows
0220: 73 79 73 74 65 6d 73 2e 0a 40 40 20 2d 33 30 31 systems..@@ -301
0230: 2c 37 20 2b 33 30 33 2c 37 20 40 40 0d 0a 20 20 ,7 +303,7 @@..
0240: 20 20 20 23 20 62 65 65 6e 20 6d 61 64 65 20 74 # been made t
0250: 6f 20 6d 61 6b 65 20 61 20 72 65 61 73 6f 6e 61 o make a reasona
0260: 62 6c 65 20 67 75 65 73 73 2c 20 62 75 74 20 74 ble guess, but t
0270: 68 69 73 20 74 61 62 6c 65 20 6e 65 65 64 73 20 his table needs
0280: 74 6f 20 62 65 0a 20 20 20 20 20 23 20 74 61 6b to be. # tak
0290: 65 6e 20 77 69 74 68 20 61 20 67 72 61 69 6e 20 en with a grain
02a0: 6f 66 20 73 61 6c 74 2e 0a 20 0a 2d 20 20 20 20 of salt.. .-
02b0: 76 61 72 69 61 62 6c 65 20 57 69 6e 5a 6f 6e 65 variable WinZone
02c0: 49 6e 66 6f 20 5b 64 69 63 74 20 63 72 65 61 74 Info [dict creat
02d0: 65 20 7b 2a 7d 7b 0a 2b 20 20 20 20 76 61 72 69 e {*}{.+ vari
02e0: 61 62 6c 65 20 57 69 6e 5a 6f 6e 65 49 6e 66 6f able WinZoneInfo
02f0: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 63 [::tcl::dict::c
0300: 72 65 61 74 65 20 7b 2a 7d 7b 0a 20 09 7b 2d 34 reate {*}{. .{-4
0310: 33 32 30 30 20 30 20 33 36 30 30 20 30 20 30 20 3200 0 3600 0 0
0320: 30 20 30 20 30 20 30 20 30 20 30 20 30 20 30 20 0 0 0 0 0 0 0 0
0330: 30 20 30 20 30 20 30 20 30 20 30 7d 20 20 3a 50 0 0 0 0 0 0} :P
0340: 61 63 69 66 69 63 2f 4b 77 61 6a 61 6c 65 69 6e acific/Kwajalein
0350: 0a 20 09 7b 2d 33 39 36 30 30 20 30 20 33 36 30 . .{-39600 0 360
0360: 30 20 30 20 30 20 30 20 30 20 30 20 30 20 30 20 0 0 0 0 0 0 0 0
0370: 30 20 30 20 30 20 30 20 30 20 30 20 30 20 30 20 0 0 0 0 0 0 0 0
0380: 30 7d 09 20 3a 50 61 63 69 66 69 63 2f 4d 69 64 0}. :Pacific/Mid
0390: 77 61 79 0a 20 09 7b 2d 33 36 30 30 30 20 30 20 way. .{-36000 0
03a0: 33 36 30 30 20 30 20 30 20 30 20 30 20 30 20 30 3600 0 0 0 0 0 0
03b0: 20 30 20 30 20 30 20 30 20 30 20 30 20 30 20 30 0 0 0 0 0 0 0 0
03c0: 20 30 20 30 7d 20 20 3a 50 61 63 69 66 69 63 2f 0 0} :Pacific/
03d0: 48 6f 6e 6f 6c 75 6c 75 0a 40 40 20 2d 33 39 30 Honolulu.@@ -390
03e0: 2c 33 37 20 2b 33 39 32 2c 33 37 20 40 40 0d 0a ,37 +392,37 @@..
03f0: 20 09 7b 20 6a 75 6c 69 61 6e 44 61 79 20 7d 20 .{ julianDay }
0400: 31 20 7b 7d 0a 20 0a 20 09 7b 20 65 72 61 20 63 1 {}. . .{ era c
0410: 65 6e 74 75 72 79 20 79 65 61 72 4f 66 43 65 6e entury yearOfCen
0420: 74 75 72 79 20 6d 6f 6e 74 68 20 64 61 79 4f 66 tury month dayOf
0430: 4d 6f 6e 74 68 20 7d 20 32 20 7b 0a 2d 09 20 20 Month } 2 {.-.
0440: 20 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20 dict set date
0450: 79 65 61 72 20 5b 65 78 70 72 20 7b 20 31 30 30 year [expr { 100
0460: 20 2a 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 * [dict get $da
0470: 74 65 20 63 65 6e 74 75 72 79 5d 0a 2d 09 09 09 te century].-...
0480: 09 20 20 20 20 20 20 20 2b 20 5b 64 69 63 74 20 . + [dict
0490: 67 65 74 20 24 64 61 74 65 20 79 65 61 72 4f 66 get $date yearOf
04a0: 43 65 6e 74 75 72 79 5d 20 7d 5d 0a 2b 09 20 20 Century] }].+.
04b0: 20 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20 dict set date
04c0: 79 65 61 72 20 5b 65 78 70 72 20 7b 20 31 30 30 year [expr { 100
04d0: 20 2a 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a * [::tcl::dict:
04e0: 3a 67 65 74 20 24 64 61 74 65 20 63 65 6e 74 75 :get $date centu
04f0: 72 79 5d 0a 2b 09 09 09 09 20 20 20 20 20 20 20 ry].+....
0500: 2b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a + [::tcl::dict::
0510: 67 65 74 20 24 64 61 74 65 20 79 65 61 72 4f 66 get $date yearOf
0520: 43 65 6e 74 75 72 79 5d 20 7d 5d 0a 20 09 20 20 Century] }]. .
0530: 20 20 73 65 74 20 64 61 74 65 20 5b 47 65 74 4a set date [GetJ
0540: 75 6c 69 61 6e 44 61 79 46 72 6f 6d 45 72 61 59 ulianDayFromEraY
0550: 65 61 72 4d 6f 6e 74 68 44 61 79 20 24 64 61 74 earMonthDay $dat
0560: 65 5b 73 65 74 20 64 61 74 65 20 7b 7d 5d 20 5c e[set date {}] \
0570: 0a 20 09 09 09 20 20 24 63 68 61 6e 67 65 6f 76 . ... $changeov
0580: 65 72 5d 0a 20 09 7d 0a 20 09 7b 20 65 72 61 20 er]. .}. .{ era
0590: 63 65 6e 74 75 72 79 20 79 65 61 72 4f 66 43 65 century yearOfCe
05a0: 6e 74 75 72 79 20 64 61 79 4f 66 59 65 61 72 20 ntury dayOfYear
05b0: 7d 20 32 20 7b 0a 2d 09 20 20 20 20 64 69 63 74 } 2 {.-. dict
05c0: 20 73 65 74 20 64 61 74 65 20 79 65 61 72 20 5b set date year [
05d0: 65 78 70 72 20 7b 20 31 30 30 20 2a 20 5b 64 69 expr { 100 * [di
05e0: 63 74 20 67 65 74 20 24 64 61 74 65 20 63 65 6e ct get $date cen
05f0: 74 75 72 79 5d 0a 2d 09 09 09 09 20 20 20 20 20 tury].-....
0600: 20 20 2b 20 5b 64 69 63 74 20 67 65 74 20 24 64 + [dict get $d
0610: 61 74 65 20 79 65 61 72 4f 66 43 65 6e 74 75 72 ate yearOfCentur
0620: 79 5d 20 7d 5d 0a 2b 09 20 20 20 20 64 69 63 74 y] }].+. dict
0630: 20 73 65 74 20 64 61 74 65 20 79 65 61 72 20 5b set date year [
0640: 65 78 70 72 20 7b 20 31 30 30 20 2a 20 5b 3a 3a expr { 100 * [::
0650: 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 tcl::dict::get $
0660: 64 61 74 65 20 63 65 6e 74 75 72 79 5d 0a 2b 09 date century].+.
0670: 09 09 09 20 20 20 20 20 20 20 2b 20 5b 3a 3a 74 ... + [::t
0680: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 cl::dict::get $d
0690: 61 74 65 20 79 65 61 72 4f 66 43 65 6e 74 75 72 ate yearOfCentur
06a0: 79 5d 20 7d 5d 0a 20 09 20 20 20 20 73 65 74 20 y] }]. . set
06b0: 64 61 74 65 20 5b 47 65 74 4a 75 6c 69 61 6e 44 date [GetJulianD
06c0: 61 79 46 72 6f 6d 45 72 61 59 65 61 72 44 61 79 ayFromEraYearDay
06d0: 20 24 64 61 74 65 5b 73 65 74 20 64 61 74 65 20 $date[set date
06e0: 7b 7d 5d 20 5c 0a 20 09 09 09 20 20 24 63 68 61 {}] \. ... $cha
06f0: 6e 67 65 6f 76 65 72 5d 0a 20 09 7d 0a 20 0a 20 ngeover]. .}. .
0700: 09 7b 20 63 65 6e 74 75 72 79 20 79 65 61 72 4f .{ century yearO
0710: 66 43 65 6e 74 75 72 79 20 6d 6f 6e 74 68 20 64 fCentury month d
0720: 61 79 4f 66 4d 6f 6e 74 68 20 7d 20 33 20 7b 0a ayOfMonth } 3 {.
0730: 20 09 20 20 20 20 64 69 63 74 20 73 65 74 20 64 . dict set d
0740: 61 74 65 20 65 72 61 20 43 45 0a 2d 09 20 20 20 ate era CE.-.
0750: 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20 79 dict set date y
0760: 65 61 72 20 5b 65 78 70 72 20 7b 20 31 30 30 20 ear [expr { 100
0770: 2a 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 * [dict get $dat
0780: 65 20 63 65 6e 74 75 72 79 5d 0a 2d 09 09 09 09 e century].-....
0790: 20 20 20 20 20 20 20 2b 20 5b 64 69 63 74 20 67 + [dict g
07a0: 65 74 20 24 64 61 74 65 20 79 65 61 72 4f 66 43 et $date yearOfC
07b0: 65 6e 74 75 72 79 5d 20 7d 5d 0a 2b 09 20 20 20 entury] }].+.
07c0: 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20 79 dict set date y
07d0: 65 61 72 20 5b 65 78 70 72 20 7b 20 31 30 30 20 ear [expr { 100
07e0: 2a 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a * [::tcl::dict::
07f0: 67 65 74 20 24 64 61 74 65 20 63 65 6e 74 75 72 get $date centur
0800: 79 5d 0a 2b 09 09 09 09 20 20 20 20 20 20 20 2b y].+.... +
0810: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 [::tcl::dict::g
0820: 65 74 20 24 64 61 74 65 20 79 65 61 72 4f 66 43 et $date yearOfC
0830: 65 6e 74 75 72 79 5d 20 7d 5d 0a 20 09 20 20 20 entury] }]. .
0840: 20 73 65 74 20 64 61 74 65 20 5b 47 65 74 4a 75 set date [GetJu
0850: 6c 69 61 6e 44 61 79 46 72 6f 6d 45 72 61 59 65 lianDayFromEraYe
0860: 61 72 4d 6f 6e 74 68 44 61 79 20 24 64 61 74 65 arMonthDay $date
0870: 5b 73 65 74 20 64 61 74 65 20 7b 7d 5d 20 5c 0a [set date {}] \.
0880: 20 09 09 09 20 20 24 63 68 61 6e 67 65 6f 76 65 ... $changeove
0890: 72 5d 0a 20 09 7d 0a 20 09 7b 20 63 65 6e 74 75 r]. .}. .{ centu
08a0: 72 79 20 79 65 61 72 4f 66 43 65 6e 74 75 72 79 ry yearOfCentury
08b0: 20 64 61 79 4f 66 59 65 61 72 20 7d 20 33 20 7b dayOfYear } 3 {
08c0: 0a 20 09 20 20 20 20 64 69 63 74 20 73 65 74 20 . . dict set
08d0: 64 61 74 65 20 65 72 61 20 43 45 0a 2d 09 20 20 date era CE.-.
08e0: 20 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20 dict set date
08f0: 79 65 61 72 20 5b 65 78 70 72 20 7b 20 31 30 30 year [expr { 100
0900: 20 2a 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 * [dict get $da
0910: 74 65 20 63 65 6e 74 75 72 79 5d 0a 2d 09 09 09 te century].-...
0920: 09 20 20 20 20 20 20 20 2b 20 5b 64 69 63 74 20 . + [dict
0930: 67 65 74 20 24 64 61 74 65 20 79 65 61 72 4f 66 get $date yearOf
0940: 43 65 6e 74 75 72 79 5d 20 7d 5d 0a 2b 09 20 20 Century] }].+.
0950: 20 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20 dict set date
0960: 79 65 61 72 20 5b 65 78 70 72 20 7b 20 31 30 30 year [expr { 100
0970: 20 2a 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a * [::tcl::dict:
0980: 3a 67 65 74 20 24 64 61 74 65 20 63 65 6e 74 75 :get $date centu
0990: 72 79 5d 0a 2b 09 09 09 09 20 20 20 20 20 20 20 ry].+....
09a0: 2b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a + [::tcl::dict::
09b0: 67 65 74 20 24 64 61 74 65 20 79 65 61 72 4f 66 get $date yearOf
09c0: 43 65 6e 74 75 72 79 5d 20 7d 5d 0a 20 09 20 20 Century] }]. .
09d0: 20 20 73 65 74 20 64 61 74 65 20 5b 47 65 74 4a set date [GetJ
09e0: 75 6c 69 61 6e 44 61 79 46 72 6f 6d 45 72 61 59 ulianDayFromEraY
09f0: 65 61 72 44 61 79 20 24 64 61 74 65 5b 73 65 74 earDay $date[set
0a00: 20 64 61 74 65 20 7b 7d 5d 20 5c 0a 20 09 09 09 date {}] \. ...
0a10: 20 20 24 63 68 61 6e 67 65 6f 76 65 72 5d 0a 20 $changeover].
0a20: 09 7d 0a 20 09 7b 20 69 73 6f 38 36 30 31 43 65 .}. .{ iso8601Ce
0a30: 6e 74 75 72 79 20 69 73 6f 38 36 30 31 59 65 61 ntury iso8601Yea
0a40: 72 4f 66 43 65 6e 74 75 72 79 20 69 73 6f 38 36 rOfCentury iso86
0a50: 30 31 57 65 65 6b 20 64 61 79 4f 66 57 65 65 6b 01Week dayOfWeek
0a60: 20 7d 20 33 20 7b 0a 20 09 20 20 20 20 64 69 63 } 3 {. . dic
0a70: 74 20 73 65 74 20 64 61 74 65 20 65 72 61 20 43 t set date era C
0a80: 45 0a 20 09 20 20 20 20 64 69 63 74 20 73 65 74 E. . dict set
0a90: 20 64 61 74 65 20 69 73 6f 38 36 30 31 59 65 61 date iso8601Yea
0aa0: 72 20 5c 0a 2d 09 09 5b 65 78 70 72 20 7b 20 31 r \.-..[expr { 1
0ab0: 30 30 20 2a 20 5b 64 69 63 74 20 67 65 74 20 24 00 * [dict get $
0ac0: 64 61 74 65 20 69 73 6f 38 36 30 31 43 65 6e 74 date iso8601Cent
0ad0: 75 72 79 5d 0a 2d 09 09 09 2b 20 5b 64 69 63 74 ury].-...+ [dict
0ae0: 20 67 65 74 20 24 64 61 74 65 20 69 73 6f 38 36 get $date iso86
0af0: 30 31 59 65 61 72 4f 66 43 65 6e 74 75 72 79 5d 01YearOfCentury]
0b00: 20 7d 5d 0a 2b 09 09 5b 65 78 70 72 20 7b 20 31 }].+..[expr { 1
0b10: 30 30 20 2a 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 00 * [::tcl::dic
0b20: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 69 73 6f t::get $date iso
0b30: 38 36 30 31 43 65 6e 74 75 72 79 5d 0a 2b 09 09 8601Century].+..
0b40: 09 2b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a .+ [::tcl::dict:
0b50: 3a 67 65 74 20 24 64 61 74 65 20 69 73 6f 38 36 :get $date iso86
0b60: 30 31 59 65 61 72 4f 66 43 65 6e 74 75 72 79 5d 01YearOfCentury]
0b70: 20 7d 5d 0a 20 09 20 20 20 20 73 65 74 20 64 61 }]. . set da
0b80: 74 65 20 5b 47 65 74 4a 75 6c 69 61 6e 44 61 79 te [GetJulianDay
0b90: 46 72 6f 6d 45 72 61 59 65 61 72 57 65 65 6b 44 FromEraYearWeekD
0ba0: 61 79 20 24 64 61 74 65 5b 73 65 74 20 64 61 74 ay $date[set dat
0bb0: 65 20 7b 7d 5d 20 5c 0a 20 09 09 09 20 24 63 68 e {}] \. ... $ch
0bc0: 61 6e 67 65 6f 76 65 72 5d 0a 20 09 7d 0a 40 40 angeover]. .}.@@
0bd0: 20 2d 35 32 36 2c 37 20 2b 35 32 38 2c 37 20 40 -526,7 +528,7 @
0be0: 40 0d 0a 20 0a 20 20 20 20 20 23 20 4c 65 67 61 @.. . # Lega
0bf0: 63 79 20 74 69 6d 65 20 7a 6f 6e 65 73 2c 20 75 cy time zones, u
0c00: 73 65 64 20 70 72 69 6d 61 72 69 6c 79 20 66 6f sed primarily fo
0c10: 72 20 70 61 72 73 69 6e 67 20 52 46 43 38 32 32 r parsing RFC822
0c20: 20 64 61 74 65 73 2e 0a 20 0a 2d 20 20 20 20 76 dates.. .- v
0c30: 61 72 69 61 62 6c 65 20 4c 65 67 61 63 79 54 69 ariable LegacyTi
0c40: 6d 65 5a 6f 6e 65 20 5b 64 69 63 74 20 63 72 65 meZone [dict cre
0c50: 61 74 65 20 5c 0a 2b 20 20 20 20 76 61 72 69 61 ate \.+ varia
0c60: 62 6c 65 20 4c 65 67 61 63 79 54 69 6d 65 5a 6f ble LegacyTimeZo
0c70: 6e 65 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a ne [::tcl::dict:
0c80: 3a 63 72 65 61 74 65 20 5c 0a 20 09 67 6d 74 09 :create \. .gmt.
0c90: 2b 30 30 30 30 20 5c 0a 20 09 75 74 09 2b 30 30 +0000 \. .ut.+00
0ca0: 30 30 20 5c 0a 20 09 75 74 63 09 2b 30 30 30 30 00 \. .utc.+0000
0cb0: 20 5c 0a 40 40 20 2d 36 36 37 2c 37 20 2b 36 36 \.@@ -667,7 +66
0cc0: 39 2c 36 20 40 40 0d 0a 20 0a 20 20 20 20 20 6c 9,6 @@.. . l
0cd0: 61 73 73 69 67 6e 20 5b 50 61 72 73 65 46 6f 72 assign [ParseFor
0ce0: 6d 61 74 41 72 67 73 20 7b 2a 7d 24 61 72 67 73 matArgs {*}$args
0cf0: 5d 20 66 6f 72 6d 61 74 20 6c 6f 63 61 6c 65 20 ] format locale
0d00: 74 69 6d 65 7a 6f 6e 65 0a 20 20 20 20 20 73 65 timezone. se
0d10: 74 20 6c 6f 63 61 6c 65 20 5b 73 74 72 69 6e 67 t locale [string
0d20: 20 74 6f 6c 6f 77 65 72 20 24 6c 6f 63 61 6c 65 tolower $locale
0d30: 5d 0a 2d 20 20 20 20 73 65 74 20 63 6c 6f 63 6b ].- set clock
0d40: 76 61 6c 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 val [lindex $arg
0d50: 73 20 30 5d 0a 20 0a 20 20 20 20 20 23 20 47 65 s 0]. . # Ge
0d60: 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 t the data for t
0d70: 69 6d 65 20 63 68 61 6e 67 65 73 20 69 6e 20 74 ime changes in t
0d80: 68 65 20 67 69 76 65 6e 20 7a 6f 6e 65 0a 20 20 he given zone.
0d90: 20 20 20 0a 40 40 20 2d 36 38 35 2c 31 37 20 2b .@@ -685,17 +
0da0: 36 38 36 2c 31 34 20 40 40 0d 0a 20 20 20 20 20 686,14 @@..
0db0: 23 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 27 46 # name in the 'F
0dc0: 6f 72 6d 61 74 50 72 6f 63 27 20 61 72 72 61 79 ormatProc' array
0dd0: 20 74 6f 20 61 76 6f 69 64 20 6c 6f 73 69 6e 67 to avoid losing
0de0: 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 0a 20 20 its internal.
0df0: 20 20 20 23 20 72 65 70 72 65 73 65 6e 74 61 74 # representat
0e00: 69 6f 6e 2c 20 77 68 69 63 68 20 63 6f 6e 74 61 ion, which conta
0e10: 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 72 65 73 ins the name res
0e20: 6f 6c 75 74 69 6f 6e 2e 0a 20 20 20 20 20 0a 2d olution.. .-
0e30: 20 20 20 20 73 65 74 20 70 72 6f 63 4e 61 6d 65 set procName
0e40: 20 66 6f 72 6d 61 74 70 72 6f 63 27 24 66 6f 72 formatproc'$for
0e50: 6d 61 74 27 24 6c 6f 63 61 6c 65 0a 2d 20 20 20 mat'$locale.-
0e60: 20 73 65 74 20 70 72 6f 63 4e 61 6d 65 20 5b 6e set procName [n
0e70: 61 6d 65 73 70 61 63 65 20 63 75 72 72 65 6e 74 amespace current
0e80: 5d 3a 3a 5b 73 74 72 69 6e 67 20 6d 61 70 20 7b ]::[string map {
0e90: 3a 20 7b 5c 3a 7d 20 5c 5c 20 7b 5c 5c 7d 7d 20 : {\:} \\ {\\}}
0ea0: 24 70 72 6f 63 4e 61 6d 65 5d 0a 2d 20 20 20 20 $procName].-
0eb0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 if {[info exists
0ec0: 20 46 6f 72 6d 61 74 50 72 6f 63 28 24 70 72 6f FormatProc($pro
0ed0: 63 4e 61 6d 65 29 5d 7d 20 7b 0a 2d 09 73 65 74 cName)]} {.-.set
0ee0: 20 70 72 6f 63 4e 61 6d 65 20 24 46 6f 72 6d 61 procName $Forma
0ef0: 74 50 72 6f 63 28 24 70 72 6f 63 4e 61 6d 65 29 tProc($procName)
0f00: 0a 2d 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 2b .- } else {.+
0f10: 20 20 20 20 23 73 65 74 20 70 72 6f 63 4e 61 6d #set procNam
0f20: 65 20 66 6f 72 6d 61 74 70 72 6f 63 27 0a 2b 20 e formatproc'.+
0f30: 20 20 20 73 65 74 20 70 72 6f 63 4e 61 6d 65 20 set procName
0f40: 27 24 66 6f 72 6d 61 74 27 24 6c 6f 63 61 6c 65 '$format'$locale
0f50: 0a 2b 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f .+ if {![info
0f60: 20 65 78 69 73 74 73 20 46 6f 72 6d 61 74 50 72 exists FormatPr
0f70: 6f 63 28 24 70 72 6f 63 4e 61 6d 65 29 5d 7d 20 oc($procName)]}
0f80: 7b 0a 20 09 73 65 74 20 46 6f 72 6d 61 74 50 72 {. .set FormatPr
0f90: 6f 63 28 24 70 72 6f 63 4e 61 6d 65 29 20 5c 0a oc($procName) \.
0fa0: 2d 09 20 20 20 20 5b 50 61 72 73 65 43 6c 6f 63 -. [ParseCloc
0fb0: 6b 46 6f 72 6d 61 74 46 6f 72 6d 61 74 20 24 70 kFormatFormat $p
0fc0: 72 6f 63 4e 61 6d 65 20 24 66 6f 72 6d 61 74 20 rocName $format
0fd0: 24 6c 6f 63 61 6c 65 5d 0a 2b 09 20 20 20 20 5b $locale].+. [
0fe0: 50 61 72 73 65 43 6c 6f 63 6b 46 6f 72 6d 61 74 ParseClockFormat
0ff0: 46 6f 72 6d 61 74 20 66 6f 72 6d 61 74 70 72 6f Format formatpro
1000: 63 5b 73 74 72 69 6e 67 20 6d 61 70 20 7b 3a 20 c[string map {:
1010: 7b 5c 3a 7d 20 5c 5c 20 7b 5c 5c 7d 7d 20 24 70 {\:} \\ {\\}} $p
1020: 72 6f 63 4e 61 6d 65 5d 20 24 66 6f 72 6d 61 74 rocName] $format
1030: 20 24 6c 6f 63 61 6c 65 5d 0a 20 20 20 20 20 7d $locale]. }
1040: 0a 20 20 20 20 20 0a 2d 20 20 20 20 72 65 74 75 . .- retu
1050: 72 6e 20 5b 24 70 72 6f 63 4e 61 6d 65 20 24 63 rn [$procName $c
1060: 6c 6f 63 6b 76 61 6c 20 24 74 69 6d 65 7a 6f 6e lockval $timezon
1070: 65 5d 0a 2d 0a 2b 20 20 20 20 24 46 6f 72 6d 61 e].-.+ $Forma
1080: 74 50 72 6f 63 28 24 70 72 6f 63 4e 61 6d 65 29 tProc($procName)
1090: 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30 [lindex $args 0
10a0: 5d 20 24 74 69 6d 65 7a 6f 6e 65 0a 20 7d 0a 20 ] $timezone. }.
10b0: 0a 20 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . #-------------
10c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 40 40 20 2d 37 32 ---------.@@ -72
1100: 31 2c 37 20 2b 37 31 39 2c 39 20 40 40 0d 0a 20 1,7 +719,9 @@..
1110: 0a 20 20 20 20 20 23 20 4d 61 70 20 61 77 61 79 . # Map away
1120: 20 74 68 65 20 6c 6f 63 61 6c 65 2d 64 65 70 65 the locale-depe
1130: 6e 64 65 6e 74 20 63 6f 6d 70 6f 73 69 74 65 20 ndent composite
1140: 66 6f 72 6d 61 74 20 67 72 6f 75 70 73 0a 20 20 format groups.
1150: 20 20 20 0a 2d 20 20 20 20 45 6e 74 65 72 4c 6f .- EnterLo
1160: 63 61 6c 65 20 24 6c 6f 63 61 6c 65 20 6f 6c 64 cale $locale old
1170: 4c 6f 63 61 6c 65 0a 2b 20 20 20 20 69 66 20 7b Locale.+ if {
1180: 20 24 6c 6f 63 61 6c 65 20 6e 65 20 7b 63 7d 20 $locale ne {c}
1190: 26 26 20 24 6c 6f 63 61 6c 65 20 6e 65 20 5b 6d && $locale ne [m
11a0: 63 6c 6f 63 61 6c 65 5d 20 7d 20 7b 0a 2b 20 20 clocale] } {.+
11b0: 20 20 20 20 45 6e 74 65 72 4c 6f 63 61 6c 65 20 EnterLocale
11c0: 24 6c 6f 63 61 6c 65 20 6f 6c 64 4c 6f 63 61 6c $locale oldLocal
11d0: 65 0a 2b 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 e.+ }. .
11e0: 23 20 43 68 61 6e 67 65 20 6c 6f 63 61 6c 65 20 # Change locale
11f0: 69 66 20 61 20 66 72 65 73 68 20 6c 6f 63 61 6c if a fresh local
1200: 65 20 68 61 73 20 62 65 65 6e 20 67 69 76 65 6e e has been given
1210: 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 on the command
1220: 6c 69 6e 65 2e 0a 20 0a 40 40 20 2d 37 34 30 2c line.. .@@ -740,
1230: 37 20 2b 37 34 30 2c 37 20 40 40 0d 0a 20 20 20 7 +740,7 @@..
1240: 20 20 23 20 52 65 74 75 72 6e 20 65 69 74 68 65 # Return eithe
1250: 72 20 74 68 65 20 65 72 72 6f 72 20 6f 72 20 74 r the error or t
1260: 68 65 20 70 72 6f 63 20 6e 61 6d 65 0a 20 0a 20 he proc name. .
1270: 20 20 20 20 69 66 20 7b 20 24 73 74 61 74 75 73 if { $status
1280: 20 3d 3d 20 31 20 7d 20 7b 0a 2d 09 69 66 20 7b == 1 } {.-.if {
1290: 20 5b 6c 69 6e 64 65 78 20 5b 64 69 63 74 20 67 [lindex [dict g
12a0: 65 74 20 24 6f 70 74 73 20 2d 65 72 72 6f 72 63 et $opts -errorc
12b0: 6f 64 65 5d 20 30 5d 20 65 71 20 7b 63 6c 6f 63 ode] 0] eq {cloc
12c0: 6b 7d 20 7d 20 7b 0a 2b 09 69 66 20 7b 20 5b 6c k} } {.+.if { [l
12d0: 69 6e 64 65 78 20 5b 3a 3a 74 63 6c 3a 3a 64 69 index [::tcl::di
12e0: 63 74 3a 3a 67 65 74 20 24 6f 70 74 73 20 2d 65 ct::get $opts -e
12f0: 72 72 6f 72 63 6f 64 65 5d 20 30 5d 20 65 71 20 rrorcode] 0] eq
1300: 7b 43 4c 4f 43 4b 7d 20 7d 20 7b 0a 20 09 20 20 {CLOCK} } {. .
1310: 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 return -code e
1320: 72 72 6f 72 20 24 72 65 73 75 6c 74 0a 20 09 7d rror $result. .}
1330: 20 65 6c 73 65 20 7b 0a 20 09 20 20 20 20 72 65 else {. . re
1340: 74 75 72 6e 20 2d 6f 70 74 69 6f 6e 73 20 24 6f turn -options $o
1350: 70 74 73 20 24 72 65 73 75 6c 74 0a 40 40 20 2d pts $result.@@ -
1360: 37 39 32 2c 37 20 2b 37 39 32 2c 37 20 40 40 0d 792,7 +792,7 @@.
1370: 0a 20 09 09 09 09 20 5b 6c 69 73 74 20 40 44 41 . .... [list @DA
1380: 59 53 5f 4f 46 5f 57 45 45 4b 5f 41 42 42 52 45 YS_OF_WEEK_ABBRE
1390: 56 40 20 5c 0a 20 09 09 09 09 20 20 20 20 20 20 V@ \. ....
13a0: 5b 6c 69 73 74 20 5b 6d 63 20 44 41 59 53 5f 4f [list [mc DAYS_O
13b0: 46 5f 57 45 45 4b 5f 41 42 42 52 45 56 5d 5d 5d F_WEEK_ABBREV]]]
13c0: 20 5c 0a 20 09 09 09 09 20 7b 20 5b 6c 69 6e 64 \. .... { [lind
13d0: 65 78 20 40 44 41 59 53 5f 4f 46 5f 57 45 45 4b ex @DAYS_OF_WEEK
13e0: 5f 41 42 42 52 45 56 40 20 5c 0a 2d 09 09 09 09 _ABBREV@ \.-....
13f0: 09 5b 65 78 70 72 20 7b 5b 64 69 63 74 20 67 65 .[expr {[dict ge
1400: 74 20 24 64 61 74 65 20 64 61 79 4f 66 57 65 65 t $date dayOfWee
1410: 6b 5d 20 5c 0a 2b 09 09 09 09 09 5b 65 78 70 72 k] \.+.....[expr
1420: 20 7b 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a {[::tcl::dict::
1430: 67 65 74 20 24 64 61 74 65 20 64 61 79 4f 66 57 get $date dayOfW
1440: 65 65 6b 5d 20 5c 0a 20 09 09 09 09 09 09 20 20 eek] \. ......
1450: 20 25 20 37 7d 5d 5d 7d 5d 0a 20 09 09 20 20 20 % 7}]]}]. ..
1460: 20 7d 09 09 09 20 0a 20 09 09 20 20 20 20 41 20 }... . .. A
1470: 7b 09 09 09 23 20 44 61 79 20 6f 66 20 77 65 65 {...# Day of wee
1480: 6b 2c 20 73 70 65 6c 74 20 6f 75 74 2e 0a 40 40 k, spelt out..@@
1490: 20 2d 38 30 32 2c 37 20 2b 38 30 32 2c 37 20 40 -802,7 +802,7 @
14a0: 40 0d 0a 20 09 09 09 09 20 5b 6c 69 73 74 20 40 @.. .... [list @
14b0: 44 41 59 53 5f 4f 46 5f 57 45 45 4b 5f 46 55 4c DAYS_OF_WEEK_FUL
14c0: 4c 40 20 5c 0a 20 09 09 09 09 20 20 20 20 20 20 L@ \. ....
14d0: 5b 6c 69 73 74 20 5b 6d 63 20 44 41 59 53 5f 4f [list [mc DAYS_O
14e0: 46 5f 57 45 45 4b 5f 46 55 4c 4c 5d 5d 5d 20 5c F_WEEK_FULL]]] \
14f0: 0a 20 09 09 09 09 20 7b 20 5b 6c 69 6e 64 65 78 . .... { [lindex
1500: 20 40 44 41 59 53 5f 4f 46 5f 57 45 45 4b 5f 46 @DAYS_OF_WEEK_F
1510: 55 4c 4c 40 20 5c 0a 2d 09 09 09 09 09 5b 65 78 ULL@ \.-.....[ex
1520: 70 72 20 7b 5b 64 69 63 74 20 67 65 74 20 24 64 pr {[dict get $d
1530: 61 74 65 20 64 61 79 4f 66 57 65 65 6b 5d 20 5c ate dayOfWeek] \
1540: 0a 2b 09 09 09 09 09 5b 65 78 70 72 20 7b 5b 3a .+.....[expr {[:
1550: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 :tcl::dict::get
1560: 24 64 61 74 65 20 64 61 79 4f 66 57 65 65 6b 5d $date dayOfWeek]
1570: 20 5c 0a 20 09 09 09 09 09 09 20 20 20 25 20 37 \. ...... % 7
1580: 7d 5d 5d 7d 5d 0a 20 09 09 20 20 20 20 7d 0a 20 }]]}]. .. }.
1590: 09 09 20 20 20 20 62 20 2d 20 68 20 7b 09 09 23 .. b - h {..#
15a0: 20 4e 61 6d 65 20 6f 66 20 6d 6f 6e 74 68 2c 20 Name of month,
15b0: 61 62 62 72 65 76 69 61 74 65 64 2e 0a 40 40 20 abbreviated..@@
15c0: 2d 38 31 32 2c 37 20 2b 38 31 32 2c 37 20 40 40 -812,7 +812,7 @@
15d0: 0d 0a 20 09 09 09 09 20 5b 6c 69 73 74 20 40 4d .. .... [list @M
15e0: 4f 4e 54 48 53 5f 41 42 42 52 45 56 40 20 5c 0a ONTHS_ABBREV@ \.
15f0: 20 09 09 09 09 20 20 20 20 20 20 5b 6c 69 73 74 .... [list
1600: 20 5b 6d 63 20 4d 4f 4e 54 48 53 5f 41 42 42 52 [mc MONTHS_ABBR
1610: 45 56 5d 5d 5d 20 5c 0a 20 09 09 09 09 20 7b 20 EV]]] \. .... {
1620: 5b 6c 69 6e 64 65 78 20 40 4d 4f 4e 54 48 53 5f [lindex @MONTHS_
1630: 41 42 42 52 45 56 40 20 5c 0a 2d 09 09 09 09 09 ABBREV@ \.-.....
1640: 5b 65 78 70 72 20 7b 5b 64 69 63 74 20 67 65 74 [expr {[dict get
1650: 20 24 64 61 74 65 20 6d 6f 6e 74 68 5d 2d 31 7d $date month]-1}
1660: 5d 5d 7d 5d 0a 2b 09 09 09 09 09 5b 65 78 70 72 ]]}].+.....[expr
1670: 20 7b 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a {[::tcl::dict::
1680: 67 65 74 20 24 64 61 74 65 20 6d 6f 6e 74 68 5d get $date month]
1690: 2d 31 7d 5d 5d 7d 5d 0a 20 09 09 20 20 20 20 7d -1}]]}]. .. }
16a0: 0a 20 09 09 20 20 20 20 42 20 7b 09 09 09 23 20 . .. B {...#
16b0: 4e 61 6d 65 20 6f 66 20 6d 6f 6e 74 68 2c 20 73 Name of month, s
16c0: 70 65 6c 74 20 6f 75 74 0a 20 09 09 09 61 70 70 pelt out. ...app
16d0: 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67 end formatString
16e0: 20 25 73 0a 40 40 20 2d 38 32 31 2c 32 30 20 2b %s.@@ -821,20 +
16f0: 38 32 31 2c 32 30 20 40 40 0d 0a 20 09 09 09 09 821,20 @@.. ....
1700: 20 5b 6c 69 73 74 20 40 4d 4f 4e 54 48 53 5f 46 [list @MONTHS_F
1710: 55 4c 4c 40 20 5c 0a 20 09 09 09 09 20 20 20 20 ULL@ \. ....
1720: 20 20 5b 6c 69 73 74 20 5b 6d 63 20 4d 4f 4e 54 [list [mc MONT
1730: 48 53 5f 46 55 4c 4c 5d 5d 5d 20 5c 0a 20 09 09 HS_FULL]]] \. ..
1740: 09 09 20 7b 20 5b 6c 69 6e 64 65 78 20 40 4d 4f .. { [lindex @MO
1750: 4e 54 48 53 5f 46 55 4c 4c 40 20 5c 0a 2d 09 09 NTHS_FULL@ \.-..
1760: 09 09 09 5b 65 78 70 72 20 7b 5b 64 69 63 74 20 ...[expr {[dict
1770: 67 65 74 20 24 64 61 74 65 20 6d 6f 6e 74 68 5d get $date month]
1780: 2d 31 7d 5d 5d 7d 5d 0a 2b 09 09 09 09 09 5b 65 -1}]]}].+.....[e
1790: 78 70 72 20 7b 5b 3a 3a 74 63 6c 3a 3a 64 69 63 xpr {[::tcl::dic
17a0: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 6d 6f 6e t::get $date mon
17b0: 74 68 5d 2d 31 7d 5d 5d 7d 5d 0a 20 09 09 20 20 th]-1}]]}]. ..
17c0: 20 20 7d 0a 20 09 09 20 20 20 20 43 20 7b 09 09 }. .. C {..
17d0: 09 23 20 43 65 6e 74 75 72 79 20 6e 75 6d 62 65 .# Century numbe
17e0: 72 0a 20 09 09 09 61 70 70 65 6e 64 20 66 6f 72 r. ...append for
17f0: 6d 61 74 53 74 72 69 6e 67 20 25 30 32 64 0a 20 matString %02d.
1800: 09 09 09 61 70 70 65 6e 64 20 73 75 62 73 74 69 ...append substi
1810: 74 75 65 6e 74 73 20 5c 0a 2d 09 09 09 20 20 20 tuents \.-...
1820: 20 7b 20 5b 65 78 70 72 20 7b 5b 64 69 63 74 20 { [expr {[dict
1830: 67 65 74 20 24 64 61 74 65 20 79 65 61 72 5d 20 get $date year]
1840: 2f 20 31 30 30 7d 5d 7d 0a 2b 09 09 09 20 20 20 / 100}]}.+...
1850: 20 7b 20 5b 65 78 70 72 20 7b 5b 3a 3a 74 63 6c { [expr {[::tcl
1860: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 ::dict::get $dat
1870: 65 20 79 65 61 72 5d 20 2f 20 31 30 30 7d 5d 7d e year] / 100}]}
1880: 0a 20 09 09 20 20 20 20 7d 0a 20 09 09 20 20 20 . .. }. ..
1890: 20 64 20 7b 09 09 09 23 20 44 61 79 20 6f 66 20 d {...# Day of
18a0: 6d 6f 6e 74 68 2c 20 77 69 74 68 20 6c 65 61 64 month, with lead
18b0: 69 6e 67 20 7a 65 72 6f 0a 20 09 09 09 61 70 70 ing zero. ...app
18c0: 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67 end formatString
18d0: 20 25 30 32 64 0a 2d 09 09 09 61 70 70 65 6e 64 %02d.-...append
18e0: 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 7b 20 substituents {
18f0: 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20 [dict get $date
1900: 64 61 79 4f 66 4d 6f 6e 74 68 5d 7d 0a 2b 09 09 dayOfMonth]}.+..
1910: 09 61 70 70 65 6e 64 20 73 75 62 73 74 69 74 75 .append substitu
1920: 65 6e 74 73 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 ents { [::tcl::d
1930: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 64 ict::get $date d
1940: 61 79 4f 66 4d 6f 6e 74 68 5d 7d 0a 20 09 09 20 ayOfMonth]}. ..
1950: 20 20 20 7d 0a 20 09 09 20 20 20 20 65 20 7b 09 }. .. e {.
1960: 09 09 23 20 44 61 79 20 6f 66 20 6d 6f 6e 74 68 ..# Day of month
1970: 2c 20 77 69 74 68 6f 75 74 20 6c 65 61 64 69 6e , without leadin
1980: 67 20 7a 65 72 6f 0a 20 09 09 09 61 70 70 65 6e g zero. ...appen
1990: 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67 20 25 d formatString %
19a0: 32 64 0a 2d 09 09 09 61 70 70 65 6e 64 20 73 75 2d.-...append su
19b0: 62 73 74 69 74 75 65 6e 74 73 20 7b 20 5b 64 69 bstituents { [di
19c0: 63 74 20 67 65 74 20 24 64 61 74 65 20 64 61 79 ct get $date day
19d0: 4f 66 4d 6f 6e 74 68 5d 7d 0a 2b 09 09 09 61 70 OfMonth]}.+...ap
19e0: 70 65 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 pend substituent
19f0: 73 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 s { [::tcl::dict
1a00: 3a 3a 67 65 74 20 24 64 61 74 65 20 64 61 79 4f ::get $date dayO
1a10: 66 4d 6f 6e 74 68 5d 7d 0a 20 09 09 20 20 20 20 fMonth]}. ..
1a20: 7d 0a 20 09 09 20 20 20 20 45 20 7b 09 09 09 23 }. .. E {...#
1a30: 20 46 6f 72 6d 61 74 20 67 72 6f 75 70 20 69 6e Format group in
1a40: 20 61 20 6c 6f 63 61 6c 65 2d 64 65 70 65 6e 64 a locale-depend
1a50: 65 6e 74 0a 20 09 09 09 09 09 23 20 61 6c 74 65 ent. .....# alte
1a60: 72 6e 61 74 69 76 65 20 65 72 61 0a 40 40 20 2d rnative era.@@ -
1a70: 38 36 31 2c 32 33 20 2b 38 36 31 2c 32 33 20 40 861,23 +861,23 @
1a80: 40 0d 0a 20 09 09 09 09 09 23 20 77 65 65 6b 20 @.. .....# week
1a90: 6e 75 6d 62 65 72 0a 20 09 09 09 61 70 70 65 6e number. ...appen
1aa0: 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67 20 25 d formatString %
1ab0: 30 32 64 0a 20 09 09 09 61 70 70 65 6e 64 20 73 02d. ...append s
1ac0: 75 62 73 74 69 74 75 65 6e 74 73 20 5c 0a 2d 09 ubstituents \.-.
1ad0: 09 09 20 20 20 20 7b 20 5b 65 78 70 72 20 7b 20 .. { [expr {
1ae0: 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20 [dict get $date
1af0: 69 73 6f 38 36 30 31 59 65 61 72 5d 20 25 20 31 iso8601Year] % 1
1b00: 30 30 20 7d 5d 7d 0a 2b 09 09 09 20 20 20 20 7b 00 }]}.+... {
1b10: 20 5b 65 78 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a [expr { [::tcl:
1b20: 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 :dict::get $date
1b30: 20 69 73 6f 38 36 30 31 59 65 61 72 5d 20 25 20 iso8601Year] %
1b40: 31 30 30 20 7d 5d 7d 0a 20 09 09 20 20 20 20 7d 100 }]}. .. }
1b50: 0a 20 09 09 20 20 20 20 47 20 7b 09 09 09 23 20 . .. G {...#
1b60: 46 6f 75 72 2d 64 69 67 69 74 20 79 65 61 72 20 Four-digit year
1b70: 72 65 6c 61 74 69 76 65 20 74 6f 20 49 53 4f 38 relative to ISO8
1b80: 36 30 31 0a 20 09 09 09 09 09 23 20 77 65 65 6b 601. .....# week
1b90: 20 6e 75 6d 62 65 72 0a 20 09 09 09 61 70 70 65 number. ...appe
1ba0: 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67 20 nd formatString
1bb0: 25 30 32 64 0a 2d 09 09 09 61 70 70 65 6e 64 20 %02d.-...append
1bc0: 73 75 62 73 74 69 74 75 65 6e 74 73 20 7b 20 5b substituents { [
1bd0: 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20 69 dict get $date i
1be0: 73 6f 38 36 30 31 59 65 61 72 5d 7d 0a 2b 09 09 so8601Year]}.+..
1bf0: 09 61 70 70 65 6e 64 20 73 75 62 73 74 69 74 75 .append substitu
1c00: 65 6e 74 73 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 ents { [::tcl::d
1c10: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 69 ict::get $date i
1c20: 73 6f 38 36 30 31 59 65 61 72 5d 7d 0a 20 09 09 so8601Year]}. ..
1c30: 20 20 20 20 7d 0a 20 09 09 20 20 20 20 48 20 7b }. .. H {
1c40: 09 09 09 23 20 48 6f 75 72 20 69 6e 20 74 68 65 ...# Hour in the
1c50: 20 32 34 2d 68 6f 75 72 20 64 61 79 2c 20 6c 65 24-hour day, le
1c60: 61 64 69 6e 67 20 7a 65 72 6f 0a 20 09 09 09 61 ading zero. ...a
1c70: 70 70 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 ppend formatStri
1c80: 6e 67 20 25 30 32 64 0a 20 09 09 09 61 70 70 65 ng %02d. ...appe
1c90: 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 nd substituents
1ca0: 5c 0a 2d 09 09 09 20 20 20 20 7b 20 5b 65 78 70 \.-... { [exp
1cb0: 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64 r { [dict get $d
1cc0: 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 ate localSeconds
1cd0: 5d 20 5c 0a 2b 09 09 09 20 20 20 20 7b 20 5b 65 ] \.+... { [e
1ce0: 78 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 xpr { [::tcl::di
1cf0: 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 6c 6f ct::get $date lo
1d00: 63 61 6c 53 65 63 6f 6e 64 73 5d 20 5c 0a 20 09 calSeconds] \. .
1d10: 09 09 09 09 20 20 2f 20 33 36 30 30 20 25 20 32 .... / 3600 % 2
1d20: 34 7d 5d 7d 0a 20 09 09 20 20 20 20 7d 0a 20 09 4}]}. .. }. .
1d30: 09 20 20 20 20 49 20 7b 09 09 09 23 20 48 6f 75 . I {...# Hou
1d40: 72 20 41 4d 2f 50 4d 2c 20 77 69 74 68 20 6c 65 r AM/PM, with le
1d50: 61 64 69 6e 67 20 7a 65 72 6f 0a 20 09 09 09 61 ading zero. ...a
1d60: 70 70 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 ppend formatStri
1d70: 6e 67 20 25 30 32 64 0a 20 09 09 09 61 70 70 65 ng %02d. ...appe
1d80: 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 nd substituents
1d90: 5c 0a 2d 09 09 09 20 20 20 20 7b 20 5b 65 78 70 \.-... { [exp
1da0: 72 20 7b 20 28 20 28 20 28 20 5b 64 69 63 74 20 r { ( ( ( [dict
1db0: 67 65 74 20 24 64 61 74 65 20 6c 6f 63 61 6c 53 get $date localS
1dc0: 65 63 6f 6e 64 73 5d 20 5c 0a 2b 09 09 09 20 20 econds] \.+...
1dd0: 20 20 7b 20 5b 65 78 70 72 20 7b 20 28 20 28 20 { [expr { ( (
1de0: 28 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a ( [::tcl::dict::
1df0: 67 65 74 20 24 64 61 74 65 20 6c 6f 63 61 6c 53 get $date localS
1e00: 65 63 6f 6e 64 73 5d 20 5c 0a 20 09 09 09 09 09 econds] \. .....
1e10: 20 20 20 20 25 20 38 36 34 30 30 20 29 20 5c 0a % 86400 ) \.
1e20: 20 09 09 09 09 09 20 20 2b 20 38 36 34 30 30 20 ..... + 86400
1e30: 5c 0a 20 09 09 09 09 09 20 20 2d 20 33 36 30 30 \. ..... - 3600
1e40: 20 29 20 5c 0a 40 40 20 2d 38 38 36 2c 32 33 20 ) \.@@ -886,23
1e50: 2b 38 38 36 2c 32 33 20 40 40 0d 0a 20 09 09 20 +886,23 @@.. ..
1e60: 20 20 20 7d 0a 20 09 09 20 20 20 20 6a 20 7b 09 }. .. j {.
1e70: 09 09 23 20 44 61 79 20 6f 66 20 79 65 61 72 20 ..# Day of year
1e80: 28 30 30 31 2d 33 36 36 29 0a 20 09 09 09 61 70 (001-366). ...ap
1e90: 70 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 6e pend formatStrin
1ea0: 67 20 25 30 33 64 0a 2d 09 09 09 61 70 70 65 6e g %03d.-...appen
1eb0: 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 7b d substituents {
1ec0: 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65 [dict get $date
1ed0: 20 64 61 79 4f 66 59 65 61 72 5d 7d 0a 2b 09 09 dayOfYear]}.+..
1ee0: 09 61 70 70 65 6e 64 20 73 75 62 73 74 69 74 75 .append substitu
1ef0: 65 6e 74 73 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 ents { [::tcl::d
1f00: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 64 ict::get $date d
1f10: 61 79 4f 66 59 65 61 72 5d 7d 0a 20 09 09 20 20 ayOfYear]}. ..
1f20: 20 20 7d 0a 20 09 09 20 20 20 20 4a 20 7b 09 09 }. .. J {..
1f30: 09 23 20 4a 75 6c 69 61 6e 20 44 61 79 20 4e 75 .# Julian Day Nu
1f40: 6d 62 65 72 0a 20 09 09 09 61 70 70 65 6e 64 20 mber. ...append
1f50: 66 6f 72 6d 61 74 53 74 72 69 6e 67 20 25 30 37 formatString %07
1f60: 6c 64 0a 2d 09 09 09 61 70 70 65 6e 64 20 73 75 ld.-...append su
1f70: 62 73 74 69 74 75 65 6e 74 73 20 7b 20 5b 64 69 bstituents { [di
1f80: 63 74 20 67 65 74 20 24 64 61 74 65 20 6a 75 6c ct get $date jul
1f90: 69 61 6e 44 61 79 5d 7d 0a 2b 09 09 09 61 70 70 ianDay]}.+...app
1fa0: 65 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 end substituents
1fb0: 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a { [::tcl::dict:
1fc0: 3a 67 65 74 20 24 64 61 74 65 20 6a 75 6c 69 61 :get $date julia
1fd0: 6e 44 61 79 5d 7d 0a 20 09 09 20 20 20 20 7d 0a nDay]}. .. }.
1fe0: 20 09 09 20 20 20 20 6b 20 7b 09 09 09 23 20 48 .. k {...# H
1ff0: 6f 75 72 20 28 30 2d 32 33 29 2c 20 6e 6f 20 6c our (0-23), no l
2000: 65 61 64 69 6e 67 20 7a 65 72 6f 0a 20 09 09 09 eading zero. ...
2010: 61 70 70 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 append formatStr
2020: 69 6e 67 20 25 32 64 0a 20 09 09 09 61 70 70 65 ing %2d. ...appe
2030: 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 nd substituents
2040: 5c 0a 2d 09 09 09 20 20 20 20 7b 20 5b 65 78 70 \.-... { [exp
2050: 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64 r { [dict get $d
2060: 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 ate localSeconds
2070: 5d 20 0a 2b 09 09 09 20 20 20 20 7b 20 5b 65 78 ] .+... { [ex
2080: 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 pr { [::tcl::dic
2090: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 6c 6f 63 t::get $date loc
20a0: 61 6c 53 65 63 6f 6e 64 73 5d 20 0a 20 09 09 09 alSeconds] . ...
20b0: 09 20 20 20 20 20 20 2f 20 33 36 30 30 0a 20 09 . / 3600. .
20c0: 09 09 09 20 20 20 20 20 20 25 20 32 34 20 7d 5d ... % 24 }]
20d0: 7d 0a 20 09 09 20 20 20 20 7d 0a 20 09 09 20 20 }. .. }. ..
20e0: 20 20 6c 20 7b 09 09 09 23 20 48 6f 75 72 20 28 l {...# Hour (
20f0: 31 32 2d 31 31 29 2c 20 6e 6f 20 6c 65 61 64 69 12-11), no leadi
2100: 6e 67 20 7a 65 72 6f 0a 20 09 09 09 61 70 70 65 ng zero. ...appe
2110: 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67 20 nd formatString
2120: 25 32 64 0a 20 09 09 09 61 70 70 65 6e 64 20 73 %2d. ...append s
2130: 75 62 73 74 69 74 75 65 6e 74 73 20 5c 0a 2d 09 ubstituents \.-.
2140: 09 09 20 20 20 20 7b 20 5b 65 78 70 72 20 7b 20 .. { [expr {
2150: 28 20 28 20 28 20 5b 64 69 63 74 20 67 65 74 20 ( ( ( [dict get
2160: 24 64 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e $date localSecon
2170: 64 73 5d 0a 2b 09 09 09 20 20 20 20 7b 20 5b 65 ds].+... { [e
2180: 78 70 72 20 7b 20 28 20 28 20 28 20 5b 3a 3a 74 xpr { ( ( ( [::t
2190: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 cl::dict::get $d
21a0: 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 ate localSeconds
21b0: 5d 0a 20 09 09 09 09 09 20 20 20 25 20 38 36 34 ]. ..... % 864
21c0: 30 30 20 29 0a 20 09 09 09 09 09 20 2b 20 38 36 00 ). ..... + 86
21d0: 34 30 30 0a 20 09 09 09 09 09 20 2d 20 33 36 30 400. ..... - 360
21e0: 30 20 29 0a 40 40 20 2d 39 31 31 2c 31 32 20 2b 0 ).@@ -911,12 +
21f0: 39 31 31 2c 31 32 20 40 40 0d 0a 20 09 09 20 20 911,12 @@.. ..
2200: 20 20 7d 0a 20 09 09 20 20 20 20 6d 20 7b 09 09 }. .. m {..
2210: 09 23 20 4d 6f 6e 74 68 20 6e 75 6d 62 65 72 2c .# Month number,
2220: 20 6c 65 61 64 69 6e 67 20 7a 65 72 6f 0a 20 09 leading zero. .
2230: 09 09 61 70 70 65 6e 64 20 66 6f 72 6d 61 74 53 ..append formatS
2240: 74 72 69 6e 67 20 25 30 32 64 0a 2d 09 09 09 61 tring %02d.-...a
2250: 70 70 65 6e 64 20 73 75 62 73 74 69 74 75 65 6e ppend substituen
2260: 74 73 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 ts { [dict get $
2270: 64 61 74 65 20 6d 6f 6e 74 68 5d 7d 0a 2b 09 09 date month]}.+..
2280: 09 61 70 70 65 6e 64 20 73 75 62 73 74 69 74 75 .append substitu
2290: 65 6e 74 73 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 ents { [::tcl::d
22a0: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 6d ict::get $date m
22b0: 6f 6e 74 68 5d 7d 0a 20 09 09 20 20 20 20 7d 0a onth]}. .. }.
22c0: 20 09 09 20 20 20 20 4d 20 7b 09 09 09 23 20 4d .. M {...# M
22d0: 69 6e 75 74 65 20 6f 66 20 74 68 65 20 68 6f 75 inute of the hou
22e0: 72 2c 20 6c 65 61 64 69 6e 67 20 7a 65 72 6f 0a r, leading zero.
22f0: 20 09 09 09 61 70 70 65 6e 64 20 66 6f 72 6d 61 ...append forma
2300: 74 53 74 72 69 6e 67 20 25 30 32 64 0a 20 09 09 tString %02d. ..
2310: 09 61 70 70 65 6e 64 20 73 75 62 73 74 69 74 75 .append substitu
2320: 65 6e 74 73 20 5c 0a 2d 09 09 09 20 20 20 20 7b ents \.-... {
2330: 20 5b 65 78 70 72 20 7b 20 5b 64 69 63 74 20 67 [expr { [dict g
2340: 65 74 20 24 64 61 74 65 20 6c 6f 63 61 6c 53 65 et $date localSe
2350: 63 6f 6e 64 73 5d 20 0a 2b 09 09 09 20 20 20 20 conds] .+...
2360: 7b 20 5b 65 78 70 72 20 7b 20 5b 3a 3a 74 63 6c { [expr { [::tcl
2370: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 ::dict::get $dat
2380: 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d 20 e localSeconds]
2390: 0a 20 09 09 09 09 20 20 20 20 20 20 2f 20 36 30 . .... / 60
23a0: 0a 20 09 09 09 09 20 20 20 20 20 20 25 20 36 30 . .... % 60
23b0: 20 7d 5d 7d 0a 20 09 09 20 20 20 20 7d 0a 40 40 }]}. .. }.@@
23c0: 20 2d 39 32 35 2c 37 20 2b 39 32 35 2c 37 20 40 -925,7 +925,7 @
23d0: 40 0d 0a 20 09 09 20 20 20 20 7d 0a 20 09 09 20 @.. .. }. ..
23e0: 20 20 20 4e 20 7b 09 09 09 23 20 4d 6f 6e 74 68 N {...# Month
23f0: 20 6e 75 6d 62 65 72 2c 20 6e 6f 20 6c 65 61 64 number, no lead
2400: 69 6e 67 20 7a 65 72 6f 0a 20 09 09 09 61 70 70 ing zero. ...app
2410: 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67 end formatString
2420: 20 25 32 64 0a 2d 09 09 09 61 70 70 65 6e 64 20 %2d.-...append
2430: 73 75 62 73 74 69 74 75 65 6e 74 73 20 7b 20 5b substituents { [
2440: 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20 6d dict get $date m
2450: 6f 6e 74 68 5d 7d 0a 2b 09 09 09 61 70 70 65 6e onth]}.+...appen
2460: 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 7b d substituents {
2470: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 [::tcl::dict::g
2480: 65 74 20 24 64 61 74 65 20 6d 6f 6e 74 68 5d 7d et $date month]}
2490: 0a 20 09 09 20 20 20 20 7d 0a 20 09 09 20 20 20 . .. }. ..
24a0: 20 4f 20 7b 09 09 09 23 20 41 20 66 6f 72 6d 61 O {...# A forma
24b0: 74 20 67 72 6f 75 70 20 69 6e 20 74 68 65 20 6c t group in the l
24c0: 6f 63 61 6c 65 27 73 0a 20 09 09 09 09 09 23 20 ocale's. .....#
24d0: 61 6c 74 65 72 6e 61 74 69 76 65 20 6e 75 6d 65 alternative nume
24e0: 72 61 6c 73 0a 40 40 20 2d 39 34 34 2c 37 20 2b rals.@@ -944,7 +
24f0: 39 34 34 2c 37 20 40 40 0d 0a 20 09 09 09 20 20 944,7 @@.. ...
2500: 20 20 5b 6c 69 73 74 20 73 65 74 20 41 4d 20 5b [list set AM [
2510: 73 74 72 69 6e 67 20 74 6f 75 70 70 65 72 20 5b string toupper [
2520: 6d 63 20 41 4d 5d 5d 5d 20 5c 6e 20 5c 0a 20 09 mc AM]]] \n \. .
2530: 09 09 20 20 20 20 5b 6c 69 73 74 20 73 65 74 20 .. [list set
2540: 50 4d 20 5b 73 74 72 69 6e 67 20 74 6f 75 70 70 PM [string toupp
2550: 65 72 20 5b 6d 63 20 50 4d 5d 5d 5d 20 5c 6e 0a er [mc PM]]] \n.
2560: 20 09 09 09 61 70 70 65 6e 64 20 73 75 62 73 74 ...append subst
2570: 69 74 75 65 6e 74 73 20 5c 0a 2d 09 09 09 20 20 ituents \.-...
2580: 20 20 7b 20 5b 65 78 70 72 20 7b 28 28 5b 64 69 { [expr {(([di
2590: 63 74 20 67 65 74 20 24 64 61 74 65 20 6c 6f 63 ct get $date loc
25a0: 61 6c 53 65 63 6f 6e 64 73 5d 0a 2b 09 09 09 20 alSeconds].+...
25b0: 20 20 20 7b 20 5b 65 78 70 72 20 7b 28 28 5b 3a { [expr {(([:
25c0: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 :tcl::dict::get
25d0: 24 64 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e $date localSecon
25e0: 64 73 5d 0a 20 09 09 09 09 20 20 20 20 20 20 20 ds]. ....
25f0: 25 20 38 36 34 30 30 29 20 3c 20 34 33 32 30 30 % 86400) < 43200
2600: 29 20 3f 0a 20 09 09 09 09 20 20 20 20 20 24 41 ) ?. .... $A
2610: 4d 20 3a 20 24 50 4d 7d 5d 7d 0a 20 09 09 20 20 M : $PM}]}. ..
2620: 20 20 7d 0a 40 40 20 2d 39 35 34 2c 37 20 2b 39 }.@@ -954,7 +9
2630: 35 34 2c 37 20 40 40 0d 0a 20 09 09 09 20 20 20 54,7 @@.. ...
2640: 20 5b 6c 69 73 74 20 73 65 74 20 61 6d 20 5b 6d [list set am [m
2650: 63 20 41 4d 5d 5d 20 5c 6e 20 5c 0a 20 09 09 09 c AM]] \n \. ...
2660: 20 20 20 20 5b 6c 69 73 74 20 73 65 74 20 70 6d [list set pm
2670: 20 5b 6d 63 20 50 4d 5d 5d 20 5c 6e 0a 20 09 09 [mc PM]] \n. ..
2680: 09 61 70 70 65 6e 64 20 73 75 62 73 74 69 74 75 .append substitu
2690: 65 6e 74 73 20 5c 0a 2d 09 09 09 20 20 20 20 7b ents \.-... {
26a0: 20 5b 65 78 70 72 20 7b 28 28 5b 64 69 63 74 20 [expr {(([dict
26b0: 67 65 74 20 24 64 61 74 65 20 6c 6f 63 61 6c 53 get $date localS
26c0: 65 63 6f 6e 64 73 5d 0a 2b 09 09 09 20 20 20 20 econds].+...
26d0: 7b 20 5b 65 78 70 72 20 7b 28 28 5b 3a 3a 74 63 { [expr {(([::tc
26e0: 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 l::dict::get $da
26f0: 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d te localSeconds]
2700: 0a 20 09 09 09 09 20 20 20 20 20 20 20 25 20 38 . .... % 8
2710: 36 34 30 30 29 20 3c 20 34 33 32 30 30 29 20 3f 6400) < 43200) ?
2720: 0a 20 09 09 09 09 20 20 20 20 20 24 61 6d 20 3a . .... $am :
2730: 20 24 70 6d 7d 5d 7d 0a 20 09 09 09 0a 40 40 20 $pm}]}. ....@@
2740: 2d 39 36 35 2c 31 33 20 2b 39 36 35 2c 31 33 20 -965,13 +965,13
2750: 40 40 0d 0a 20 09 09 20 20 20 20 7d 0a 20 09 09 @@.. .. }. ..
2760: 20 20 20 20 73 20 7b 09 09 09 23 20 53 65 63 6f s {...# Seco
2770: 6e 64 73 20 66 72 6f 6d 20 74 68 65 20 50 6f 73 nds from the Pos
2780: 69 78 20 45 70 6f 63 68 0a 20 09 09 09 61 70 70 ix Epoch. ...app
2790: 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67 end formatString
27a0: 20 25 73 0a 2d 09 09 09 61 70 70 65 6e 64 20 73 %s.-...append s
27b0: 75 62 73 74 69 74 75 65 6e 74 73 20 7b 20 5b 64 ubstituents { [d
27c0: 69 63 74 20 67 65 74 20 24 64 61 74 65 20 73 65 ict get $date se
27d0: 63 6f 6e 64 73 5d 7d 0a 2b 09 09 09 61 70 70 65 conds]}.+...appe
27e0: 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 nd substituents
27f0: 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a { [::tcl::dict::
2800: 67 65 74 20 24 64 61 74 65 20 73 65 63 6f 6e 64 get $date second
2810: 73 5d 7d 0a 20 09 09 20 20 20 20 7d 0a 20 09 09 s]}. .. }. ..
2820: 20 20 20 20 53 20 7b 09 09 09 23 20 53 65 63 6f S {...# Seco
2830: 6e 64 20 6f 66 20 74 68 65 20 6d 69 6e 75 74 65 nd of the minute
2840: 2c 20 77 69 74 68 20 0a 20 09 09 09 23 20 6c 65 , with . ...# le
2850: 61 64 69 6e 67 20 7a 65 72 6f 0a 20 09 09 09 61 ading zero. ...a
2860: 70 70 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 ppend formatStri
2870: 6e 67 20 25 30 32 64 0a 20 09 09 09 61 70 70 65 ng %02d. ...appe
2880: 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 nd substituents
2890: 5c 0a 2d 09 09 09 20 20 20 20 7b 20 5b 65 78 70 \.-... { [exp
28a0: 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64 r { [dict get $d
28b0: 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 ate localSeconds
28c0: 5d 20 0a 2b 09 09 09 20 20 20 20 7b 20 5b 65 78 ] .+... { [ex
28d0: 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 pr { [::tcl::dic
28e0: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 6c 6f 63 t::get $date loc
28f0: 61 6c 53 65 63 6f 6e 64 73 5d 20 0a 20 09 09 09 alSeconds] . ...
2900: 09 20 20 20 20 20 20 25 20 36 30 20 7d 5d 7d 0a . % 60 }]}.
2910: 20 09 09 20 20 20 20 7d 0a 20 09 09 20 20 20 20 .. }. ..
2920: 74 20 7b 09 09 09 23 20 41 20 6c 69 74 65 72 61 t {...# A litera
2930: 6c 20 74 61 62 20 63 68 61 72 61 63 74 65 72 0a l tab character.
2940: 40 40 20 2d 39 37 39 2c 32 30 20 2b 39 37 39 2c @@ -979,20 +979,
2950: 32 30 20 40 40 0d 0a 20 09 09 20 20 20 20 7d 0a 20 @@.. .. }.
2960: 20 09 09 20 20 20 20 75 20 7b 09 09 09 23 20 44 .. u {...# D
2970: 61 79 20 6f 66 20 74 68 65 20 77 65 65 6b 20 28 ay of the week (
2980: 31 2d 4d 6f 6e 64 61 79 2c 20 37 2d 53 75 6e 64 1-Monday, 7-Sund
2990: 61 79 29 0a 20 09 09 09 61 70 70 65 6e 64 20 66 ay). ...append f
29a0: 6f 72 6d 61 74 53 74 72 69 6e 67 20 25 31 64 0a ormatString %1d.
29b0: 2d 09 09 09 61 70 70 65 6e 64 20 73 75 62 73 74 -...append subst
29c0: 69 74 75 65 6e 74 73 20 7b 20 5b 64 69 63 74 20 ituents { [dict
29d0: 67 65 74 20 24 64 61 74 65 20 64 61 79 4f 66 57 get $date dayOfW
29e0: 65 65 6b 5d 7d 0a 2b 09 09 09 61 70 70 65 6e 64 eek]}.+...append
29f0: 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 7b 20 substituents {
2a00: 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 [::tcl::dict::ge
2a10: 74 20 24 64 61 74 65 20 64 61 79 4f 66 57 65 65 t $date dayOfWee
2a20: 6b 5d 7d 0a 20 09 09 20 20 20 20 7d 0a 20 09 09 k]}. .. }. ..
2a30: 20 20 20 20 55 20 7b 09 09 09 23 20 57 65 65 6b U {...# Week
2a40: 20 6f 66 20 74 68 65 20 79 65 61 72 20 28 30 30 of the year (00
2a50: 2d 35 33 29 2e 20 54 68 65 0a 20 09 09 09 09 09 -53). The. .....
2a60: 23 20 66 69 72 73 74 20 53 75 6e 64 61 79 20 6f # first Sunday o
2a70: 66 20 74 68 65 20 79 65 61 72 20 69 73 20 74 68 f the year is th
2a80: 65 0a 20 09 09 09 09 09 23 20 66 69 72 73 74 20 e. .....# first
2a90: 64 61 79 20 6f 66 20 77 65 65 6b 20 30 31 0a 20 day of week 01.
2aa0: 09 09 09 61 70 70 65 6e 64 20 66 6f 72 6d 61 74 ...append format
2ab0: 53 74 72 69 6e 67 20 25 30 32 64 0a 20 09 09 09 String %02d. ...
2ac0: 61 70 70 65 6e 64 20 70 72 65 46 6f 72 6d 61 74 append preFormat
2ad0: 43 6f 64 65 20 7b 0a 2d 09 09 09 20 20 20 20 73 Code {.-... s
2ae0: 65 74 20 64 6f 77 20 5b 64 69 63 74 20 67 65 74 et dow [dict get
2af0: 20 24 64 61 74 65 20 64 61 79 4f 66 57 65 65 6b $date dayOfWeek
2b00: 5d 0a 2b 09 09 09 20 20 20 20 73 65 74 20 64 6f ].+... set do
2b10: 77 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a w [::tcl::dict::
2b20: 67 65 74 20 24 64 61 74 65 20 64 61 79 4f 66 57 get $date dayOfW
2b30: 65 65 6b 5d 0a 20 09 09 09 20 20 20 20 69 66 20 eek]. ... if
2b40: 7b 20 24 64 6f 77 20 3d 3d 20 37 20 7d 20 7b 0a { $dow == 7 } {.
2b50: 20 09 09 09 09 73 65 74 20 64 6f 77 20 30 0a 20 ....set dow 0.
2b60: 09 09 09 20 20 20 20 7d 0a 20 09 09 09 20 20 20 ... }. ...
2b70: 20 69 6e 63 72 20 64 6f 77 0a 20 09 09 09 20 20 incr dow. ...
2b80: 20 20 73 65 74 20 55 77 65 65 6b 4e 75 6d 62 65 set UweekNumbe
2b90: 72 20 5c 0a 2d 09 09 09 09 5b 65 78 70 72 20 7b r \.-....[expr {
2ba0: 20 28 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 ( [dict get $da
2bb0: 74 65 20 64 61 79 4f 66 59 65 61 72 5d 20 0a 2b te dayOfYear] .+
2bc0: 09 09 09 09 5b 65 78 70 72 20 7b 20 28 20 5b 3a ....[expr { ( [:
2bd0: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 :tcl::dict::get
2be0: 24 64 61 74 65 20 64 61 79 4f 66 59 65 61 72 5d $date dayOfYear]
2bf0: 20 0a 20 09 09 09 09 09 20 20 2d 20 24 64 6f 77 . ..... - $dow
2c00: 20 2b 20 37 20 29 0a 20 09 09 09 09 09 2f 20 37 + 7 ). ...../ 7
2c10: 20 7d 5d 0a 20 09 09 09 7d 0a 40 40 20 2d 31 30 }]. ...}.@@ -10
2c20: 30 30 2c 32 31 20 2b 31 30 30 30 2c 32 31 20 40 00,21 +1000,21 @
2c30: 40 0d 0a 20 09 09 20 20 20 20 7d 0a 20 09 09 20 @.. .. }. ..
2c40: 20 20 20 56 20 7b 09 09 09 23 20 54 68 65 20 49 V {...# The I
2c50: 53 4f 38 36 30 31 20 77 65 65 6b 20 6e 75 6d 62 SO8601 week numb
2c60: 65 72 0a 20 09 09 09 61 70 70 65 6e 64 20 66 6f er. ...append fo
2c70: 72 6d 61 74 53 74 72 69 6e 67 20 25 30 32 64 0a rmatString %02d.
2c80: 2d 09 09 09 61 70 70 65 6e 64 20 73 75 62 73 74 -...append subst
2c90: 69 74 75 65 6e 74 73 20 7b 20 5b 64 69 63 74 20 ituents { [dict
2ca0: 67 65 74 20 24 64 61 74 65 20 69 73 6f 38 36 30 get $date iso860
2cb0: 31 57 65 65 6b 5d 7d 0a 2b 09 09 09 61 70 70 65 1Week]}.+...appe
2cc0: 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 nd substituents
2cd0: 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a { [::tcl::dict::
2ce0: 67 65 74 20 24 64 61 74 65 20 69 73 6f 38 36 30 get $date iso860
2cf0: 31 57 65 65 6b 5d 7d 0a 20 09 09 20 20 20 20 7d 1Week]}. .. }
2d00: 0a 20 09 09 20 20 20 20 77 20 7b 09 09 09 23 20 . .. w {...#
2d10: 44 61 79 20 6f 66 20 74 68 65 20 77 65 65 6b 20 Day of the week
2d20: 28 30 2d 53 75 6e 64 61 79 2c 0a 20 09 09 09 09 (0-Sunday,. ....
2d30: 09 23 20 36 2d 53 61 74 75 72 64 61 79 29 0a 20 .# 6-Saturday).
2d40: 09 09 09 61 70 70 65 6e 64 20 66 6f 72 6d 61 74 ...append format
2d50: 53 74 72 69 6e 67 20 25 31 64 0a 20 09 09 09 61 String %1d. ...a
2d60: 70 70 65 6e 64 20 73 75 62 73 74 69 74 75 65 6e ppend substituen
2d70: 74 73 20 5c 0a 2d 09 09 09 20 20 20 20 7b 20 5b ts \.-... { [
2d80: 65 78 70 72 20 7b 20 5b 64 69 63 74 20 67 65 74 expr { [dict get
2d90: 20 24 64 61 74 65 20 64 61 79 4f 66 57 65 65 6b $date dayOfWeek
2da0: 5d 20 25 20 37 20 7d 5d 7d 0a 2b 09 09 09 20 20 ] % 7 }]}.+...
2db0: 20 20 7b 20 5b 65 78 70 72 20 7b 20 5b 3a 3a 74 { [expr { [::t
2dc0: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 cl::dict::get $d
2dd0: 61 74 65 20 64 61 79 4f 66 57 65 65 6b 5d 20 25 ate dayOfWeek] %
2de0: 20 37 20 7d 5d 7d 0a 20 09 09 20 20 20 20 7d 0a 7 }]}. .. }.
2df0: 20 09 09 20 20 20 20 57 20 7b 09 09 09 23 20 57 .. W {...# W
2e00: 65 65 6b 20 6f 66 20 74 68 65 20 79 65 61 72 20 eek of the year
2e10: 28 30 30 2d 35 33 29 2e 20 54 68 65 20 66 69 72 (00-53). The fir
2e20: 73 74 0a 20 09 09 09 09 09 23 20 4d 6f 6e 64 61 st. .....# Monda
2e30: 79 20 6f 66 20 74 68 65 20 79 65 61 72 20 69 73 y of the year is
2e40: 20 74 68 65 20 66 69 72 73 74 20 64 61 79 0a 20 the first day.
2e50: 09 09 09 09 09 23 20 6f 66 20 77 65 65 6b 20 30 .....# of week 0
2e60: 31 2e 0a 20 09 09 09 61 70 70 65 6e 64 20 70 72 1.. ...append pr
2e70: 65 46 6f 72 6d 61 74 43 6f 64 65 20 7b 0a 20 09 eFormatCode {. .
2e80: 09 09 20 20 20 20 73 65 74 20 57 77 65 65 6b 4e .. set WweekN
2e90: 75 6d 62 65 72 20 5c 0a 2d 09 09 09 09 5b 65 78 umber \.-....[ex
2ea0: 70 72 20 7b 20 28 20 5b 64 69 63 74 20 67 65 74 pr { ( [dict get
2eb0: 20 24 64 61 74 65 20 64 61 79 4f 66 59 65 61 72 $date dayOfYear
2ec0: 5d 0a 2d 09 09 09 09 09 20 20 2d 20 5b 64 69 63 ].-..... - [dic
2ed0: 74 20 67 65 74 20 24 64 61 74 65 20 64 61 79 4f t get $date dayO
2ee0: 66 57 65 65 6b 5d 0a 2b 09 09 09 09 5b 65 78 70 fWeek].+....[exp
2ef0: 72 20 7b 20 28 20 5b 3a 3a 74 63 6c 3a 3a 64 69 r { ( [::tcl::di
2f00: 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 64 61 ct::get $date da
2f10: 79 4f 66 59 65 61 72 5d 0a 2b 09 09 09 09 09 20 yOfYear].+.....
2f20: 20 2d 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a - [::tcl::dict:
2f30: 3a 67 65 74 20 24 64 61 74 65 20 64 61 79 4f 66 :get $date dayOf
2f40: 57 65 65 6b 5d 0a 20 09 09 09 09 09 20 20 2b 20 Week]. ..... +
2f50: 37 20 29 20 0a 20 09 09 09 09 09 2f 20 37 20 7d 7 ) . ...../ 7 }
2f60: 5d 0a 20 09 09 09 7d 0a 40 40 20 2d 31 30 32 34 ]. ...}.@@ -1024
2f70: 2c 32 31 20 2b 31 30 32 34 2c 32 31 20 40 40 0d ,21 +1024,21 @@.
2f80: 0a 20 09 09 20 20 20 20 79 20 7b 09 09 09 23 20 . .. y {...#
2f90: 54 68 65 20 74 77 6f 2d 64 69 67 69 74 20 79 65 The two-digit ye
2fa0: 61 72 20 6f 66 20 74 68 65 20 63 65 6e 74 75 72 ar of the centur
2fb0: 79 0a 20 09 09 09 61 70 70 65 6e 64 20 66 6f 72 y. ...append for
2fc0: 6d 61 74 53 74 72 69 6e 67 20 25 30 32 64 0a 20 matString %02d.
2fd0: 09 09 09 61 70 70 65 6e 64 20 73 75 62 73 74 69 ...append substi
2fe0: 74 75 65 6e 74 73 20 5c 0a 2d 09 09 09 20 20 20 tuents \.-...
2ff0: 20 7b 20 5b 65 78 70 72 20 7b 20 5b 64 69 63 74 { [expr { [dict
3000: 20 67 65 74 20 24 64 61 74 65 20 79 65 61 72 5d get $date year]
3010: 20 25 20 31 30 30 20 7d 5d 7d 0a 2b 09 09 09 20 % 100 }]}.+...
3020: 20 20 20 7b 20 5b 65 78 70 72 20 7b 20 5b 3a 3a { [expr { [::
3030: 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 tcl::dict::get $
3040: 64 61 74 65 20 79 65 61 72 5d 20 25 20 31 30 30 date year] % 100
3050: 20 7d 5d 7d 0a 20 09 09 20 20 20 20 7d 0a 20 09 }]}. .. }. .
3060: 09 20 20 20 20 59 20 7b 09 09 09 23 20 54 68 65 . Y {...# The
3070: 20 66 6f 75 72 2d 64 69 67 69 74 20 79 65 61 72 four-digit year
3080: 0a 20 09 09 09 61 70 70 65 6e 64 20 66 6f 72 6d . ...append form
3090: 61 74 53 74 72 69 6e 67 20 25 30 34 64 0a 2d 09 atString %04d.-.
30a0: 09 09 61 70 70 65 6e 64 20 73 75 62 73 74 69 74 ..append substit
30b0: 75 65 6e 74 73 20 7b 20 5b 64 69 63 74 20 67 65 uents { [dict ge
30c0: 74 20 24 64 61 74 65 20 79 65 61 72 5d 7d 0a 2b t $date year]}.+
30d0: 09 09 09 61 70 70 65 6e 64 20 73 75 62 73 74 69 ...append substi
30e0: 74 75 65 6e 74 73 20 7b 20 5b 3a 3a 74 63 6c 3a tuents { [::tcl:
30f0: 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 :dict::get $date
3100: 20 79 65 61 72 5d 7d 0a 20 09 09 20 20 20 20 7d year]}. .. }
3110: 0a 20 09 09 20 20 20 20 7a 20 7b 09 09 09 23 20 . .. z {...#
3120: 54 68 65 20 74 69 6d 65 20 7a 6f 6e 65 20 61 73 The time zone as
3130: 20 68 6f 75 72 73 20 61 6e 64 20 6d 69 6e 75 74 hours and minut
3140: 65 73 0a 20 09 09 09 09 09 23 20 65 61 73 74 20 es. .....# east
3150: 28 2b 29 20 6f 72 20 77 65 73 74 20 28 2d 29 20 (+) or west (-)
3160: 6f 66 20 47 72 65 65 6e 77 69 63 68 0a 20 09 09 of Greenwich. ..
3170: 09 61 70 70 65 6e 64 20 66 6f 72 6d 61 74 53 74 .append formatSt
3180: 72 69 6e 67 20 25 73 0a 20 09 09 09 61 70 70 65 ring %s. ...appe
3190: 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 nd substituents
31a0: 7b 20 5b 46 6f 72 6d 61 74 4e 75 6d 65 72 69 63 { [FormatNumeric
31b0: 54 69 6d 65 5a 6f 6e 65 20 5c 0a 2d 09 09 09 09 TimeZone \.-....
31c0: 09 09 20 20 20 5b 64 69 63 74 20 67 65 74 20 24 .. [dict get $
31d0: 64 61 74 65 20 74 7a 4f 66 66 73 65 74 5d 5d 7d date tzOffset]]}
31e0: 0a 2b 09 09 09 09 09 09 20 20 20 5b 3a 3a 74 63 .+...... [::tc
31f0: 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 l::dict::get $da
3200: 74 65 20 74 7a 4f 66 66 73 65 74 5d 5d 7d 0a 20 te tzOffset]]}.
3210: 09 09 20 20 20 20 7d 0a 20 09 09 20 20 20 20 5a .. }. .. Z
3220: 20 7b 09 09 09 23 20 54 68 65 20 6e 61 6d 65 20 {...# The name
3230: 6f 66 20 74 68 65 20 74 69 6d 65 20 7a 6f 6e 65 of the time zone
3240: 0a 20 09 09 09 61 70 70 65 6e 64 20 66 6f 72 6d . ...append form
3250: 61 74 53 74 72 69 6e 67 20 25 73 0a 2d 09 09 09 atString %s.-...
3260: 61 70 70 65 6e 64 20 73 75 62 73 74 69 74 75 65 append substitue
3270: 6e 74 73 20 7b 20 5b 64 69 63 74 20 67 65 74 20 nts { [dict get
3280: 24 64 61 74 65 20 74 7a 4e 61 6d 65 5d 7d 0a 2b $date tzName]}.+
3290: 09 09 09 61 70 70 65 6e 64 20 73 75 62 73 74 69 ...append substi
32a0: 74 75 65 6e 74 73 20 7b 20 5b 3a 3a 74 63 6c 3a tuents { [::tcl:
32b0: 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 :dict::get $date
32c0: 20 74 7a 4e 61 6d 65 5d 7d 0a 20 09 09 20 20 20 tzName]}. ..
32d0: 20 7d 0a 20 09 09 20 20 20 20 25 20 7b 09 09 09 }. .. % {...
32e0: 23 20 41 20 6c 69 74 65 72 61 6c 20 70 65 72 63 # A literal perc
32f0: 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20 09 ent character. .
3300: 09 09 61 70 70 65 6e 64 20 66 6f 72 6d 61 74 53 ..append formatS
3310: 74 72 69 6e 67 20 25 25 0a 40 40 20 2d 31 30 35 tring %%.@@ -105
3320: 37 2c 31 36 20 2b 31 30 35 37 2c 31 36 20 40 40 7,16 +1057,16 @@
3330: 0d 0a 20 09 09 09 20 20 20 20 5b 73 74 72 69 6e .. ... [strin
3340: 67 20 6d 61 70 20 5c 0a 20 09 09 09 09 20 5b 6c g map \. .... [l
3350: 69 73 74 20 40 42 43 45 40 20 5b 6c 69 73 74 20 ist @BCE@ [list
3360: 5b 6d 63 20 42 43 45 5d 5d 20 5c 0a 20 09 09 09 [mc BCE]] \. ...
3370: 09 20 20 20 20 20 20 40 43 45 40 20 5b 6c 69 73 . @CE@ [lis
3380: 74 20 5b 6d 63 20 43 45 5d 5d 5d 20 5c 0a 2d 09 t [mc CE]]] \.-.
3390: 09 09 09 20 20 20 20 20 20 7b 5b 64 69 63 74 20 ... {[dict
33a0: 67 65 74 20 7b 42 43 45 20 40 42 43 45 40 20 43 get {BCE @BCE@ C
33b0: 45 20 40 43 45 40 7d 20 5c 0a 2d 09 09 09 09 09 E @CE@} \.-.....
33c0: 20 20 20 20 5b 64 69 63 74 20 67 65 74 20 24 64 [dict get $d
33d0: 61 74 65 20 65 72 61 5d 5d 7d 5d 0a 2b 09 09 09 ate era]]}].+...
33e0: 09 20 20 20 20 20 20 7b 5b 3a 3a 74 63 6c 3a 3a . {[::tcl::
33f0: 64 69 63 74 3a 3a 67 65 74 20 7b 42 43 45 20 40 dict::get {BCE @
3400: 42 43 45 40 20 43 45 20 40 43 45 40 7d 20 5c 0a BCE@ CE @CE@} \.
3410: 2b 09 09 09 09 09 20 20 20 20 5b 3a 3a 74 63 6c +..... [::tcl
3420: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 ::dict::get $dat
3430: 65 20 65 72 61 5d 5d 7d 5d 0a 20 09 09 20 20 20 e era]]}]. ..
3440: 20 7d 0a 20 09 09 20 20 20 20 43 20 7b 09 09 09 }. .. C {...
3450: 23 20 4c 6f 63 61 6c 65 2d 64 65 70 65 6e 64 65 # Locale-depende
3460: 6e 74 20 65 72 61 0a 20 09 09 09 61 70 70 65 6e nt era. ...appen
3470: 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67 20 25 d formatString %
3480: 73 0a 2d 09 09 09 61 70 70 65 6e 64 20 73 75 62 s.-...append sub
3490: 73 74 69 74 75 65 6e 74 73 20 7b 20 5b 64 69 63 stituents { [dic
34a0: 74 20 67 65 74 20 24 64 61 74 65 20 6c 6f 63 61 t get $date loca
34b0: 6c 65 45 72 61 5d 7d 0a 2b 09 09 09 61 70 70 65 leEra]}.+...appe
34c0: 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 nd substituents
34d0: 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a { [::tcl::dict::
34e0: 67 65 74 20 24 64 61 74 65 20 6c 6f 63 61 6c 65 get $date locale
34f0: 45 72 61 5d 7d 0a 20 09 09 20 20 20 20 7d 0a 20 Era]}. .. }.
3500: 09 09 20 20 20 20 79 20 7b 09 09 09 23 20 4c 6f .. y {...# Lo
3510: 63 61 6c 65 2d 64 65 70 65 6e 64 65 6e 74 20 79 cale-dependent y
3520: 65 61 72 20 6f 66 20 74 68 65 20 65 72 61 0a 20 ear of the era.
3530: 09 09 09 61 70 70 65 6e 64 20 70 72 65 46 6f 72 ...append preFor
3540: 6d 61 74 43 6f 64 65 20 7b 0a 2d 09 09 09 20 20 matCode {.-...
3550: 20 20 73 65 74 20 79 20 5b 64 69 63 74 20 67 65 set y [dict ge
3560: 74 20 24 64 61 74 65 20 6c 6f 63 61 6c 65 59 65 t $date localeYe
3570: 61 72 5d 0a 2b 09 09 09 20 20 20 20 73 65 74 20 ar].+... set
3580: 79 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a y [::tcl::dict::
3590: 67 65 74 20 24 64 61 74 65 20 6c 6f 63 61 6c 65 get $date locale
35a0: 59 65 61 72 5d 0a 20 09 09 09 20 20 20 20 69 66 Year]. ... if
35b0: 20 7b 20 24 79 20 3e 3d 20 30 20 26 26 20 24 79 { $y >= 0 && $y
35c0: 20 3c 20 31 30 30 20 7d 20 7b 0a 20 09 09 09 09 < 100 } {. ....
35d0: 73 65 74 20 45 79 65 61 72 20 5b 6c 69 6e 64 65 set Eyear [linde
35e0: 78 20 24 6c 6f 63 61 6c 65 4e 75 6d 65 72 61 6c x $localeNumeral
35f0: 73 20 24 79 5d 0a 20 09 09 09 20 20 20 20 7d 20 s $y]. ... }
3600: 65 6c 73 65 20 7b 0a 40 40 20 2d 31 30 38 39 2c else {.@@ -1089,
3610: 31 34 20 2b 31 30 38 39 2c 31 34 20 40 40 0d 0a 14 +1089,14 @@..
3620: 20 09 09 09 61 70 70 65 6e 64 20 66 6f 72 6d 61 ...append forma
3630: 74 53 74 72 69 6e 67 20 25 73 0a 20 09 09 09 61 tString %s. ...a
3640: 70 70 65 6e 64 20 73 75 62 73 74 69 74 75 65 6e ppend substituen
3650: 74 73 20 5c 0a 20 09 09 09 20 20 20 20 7b 20 5b ts \. ... { [
3660: 6c 69 6e 64 65 78 20 24 6c 6f 63 61 6c 65 4e 75 lindex $localeNu
3670: 6d 65 72 61 6c 73 20 5c 0a 2d 09 09 09 09 20 20 merals \.-....
3680: 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65 [dict get $date
3690: 20 64 61 79 4f 66 4d 6f 6e 74 68 5d 5d 7d 0a 2b dayOfMonth]]}.+
36a0: 09 09 09 09 20 20 20 5b 3a 3a 74 63 6c 3a 3a 64 .... [::tcl::d
36b0: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 64 ict::get $date d
36c0: 61 79 4f 66 4d 6f 6e 74 68 5d 5d 7d 0a 20 09 09 ayOfMonth]]}. ..
36d0: 20 20 20 20 7d 0a 20 09 09 20 20 20 20 48 20 2d }. .. H -
36e0: 20 6b 20 7b 09 09 23 20 48 6f 75 72 20 6f 66 20 k {..# Hour of
36f0: 74 68 65 20 64 61 79 20 69 6e 20 61 6c 74 65 72 the day in alter
3700: 6e 61 74 69 76 65 0a 20 09 09 09 09 09 23 20 6e native. .....# n
3710: 75 6d 65 72 61 6c 73 0a 20 09 09 09 61 70 70 65 umerals. ...appe
3720: 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67 20 nd formatString
3730: 25 73 0a 20 09 09 09 61 70 70 65 6e 64 20 73 75 %s. ...append su
3740: 62 73 74 69 74 75 65 6e 74 73 20 5c 0a 20 09 09 bstituents \. ..
3750: 09 20 20 20 20 7b 20 5b 6c 69 6e 64 65 78 20 24 . { [lindex $
3760: 6c 6f 63 61 6c 65 4e 75 6d 65 72 61 6c 73 20 5c localeNumerals \
3770: 0a 2d 09 09 09 09 20 20 20 5b 65 78 70 72 20 7b .-.... [expr {
3780: 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65 [dict get $date
3790: 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d 20 0a localSeconds] .
37a0: 2b 09 09 09 09 20 20 20 5b 65 78 70 72 20 7b 20 +.... [expr {
37b0: 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 [::tcl::dict::ge
37c0: 74 20 24 64 61 74 65 20 6c 6f 63 61 6c 53 65 63 t $date localSec
37d0: 6f 6e 64 73 5d 20 0a 20 09 09 09 09 09 20 20 20 onds] . .....
37e0: 2f 20 33 36 30 30 0a 20 09 09 09 09 09 20 20 20 / 3600. .....
37f0: 25 20 32 34 20 7d 5d 5d 7d 0a 20 09 09 20 20 20 % 24 }]]}. ..
3800: 20 7d 0a 40 40 20 2d 31 31 30 35 2c 37 20 2b 31 }.@@ -1105,7 +1
3810: 31 30 35 2c 37 20 40 40 0d 0a 20 09 09 09 61 70 105,7 @@.. ...ap
3820: 70 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 6e pend formatStrin
3830: 67 20 25 73 0a 20 09 09 09 61 70 70 65 6e 64 20 g %s. ...append
3840: 73 75 62 73 74 69 74 75 65 6e 74 73 20 5c 0a 20 substituents \.
3850: 09 09 09 20 20 20 20 7b 20 5b 6c 69 6e 64 65 78 ... { [lindex
3860: 20 24 6c 6f 63 61 6c 65 4e 75 6d 65 72 61 6c 73 $localeNumerals
3870: 20 5c 0a 2d 09 09 09 09 20 20 20 5b 65 78 70 72 \.-.... [expr
3880: 20 7b 20 28 20 28 20 28 20 5b 64 69 63 74 20 67 { ( ( ( [dict g
3890: 65 74 20 24 64 61 74 65 20 6c 6f 63 61 6c 53 65 et $date localSe
38a0: 63 6f 6e 64 73 5d 0a 2b 09 09 09 09 20 20 20 5b conds].+.... [
38b0: 65 78 70 72 20 7b 20 28 20 28 20 28 20 5b 3a 3a expr { ( ( ( [::
38c0: 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 tcl::dict::get $
38d0: 64 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 date localSecond
38e0: 73 5d 0a 20 09 09 09 09 09 09 20 25 20 38 36 34 s]. ...... % 864
38f0: 30 30 20 29 0a 20 09 09 09 09 09 20 20 20 20 20 00 ). .....
3900: 20 20 2b 20 38 36 34 30 30 0a 20 09 09 09 09 09 + 86400. .....
3910: 20 20 20 20 20 20 20 2d 20 33 36 30 30 20 29 0a - 3600 ).
3920: 40 40 20 2d 31 31 31 35 2c 31 34 20 2b 31 31 31 @@ -1115,14 +111
3930: 35 2c 31 34 20 40 40 0d 0a 20 09 09 20 20 20 20 5,14 @@.. ..
3940: 6d 20 7b 09 09 09 23 20 4d 6f 6e 74 68 20 6e 75 m {...# Month nu
3950: 6d 62 65 72 20 69 6e 20 61 6c 74 65 72 6e 61 74 mber in alternat
3960: 69 76 65 20 6e 75 6d 65 72 61 6c 73 0a 20 09 09 ive numerals. ..
3970: 09 61 70 70 65 6e 64 20 66 6f 72 6d 61 74 53 74 .append formatSt
3980: 72 69 6e 67 20 25 73 0a 20 09 09 09 61 70 70 65 ring %s. ...appe
3990: 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 nd substituents
39a0: 5c 0a 2d 09 09 09 20 20 20 20 7b 20 5b 6c 69 6e \.-... { [lin
39b0: 64 65 78 20 24 6c 6f 63 61 6c 65 4e 75 6d 65 72 dex $localeNumer
39c0: 61 6c 73 20 5b 64 69 63 74 20 67 65 74 20 24 64 als [dict get $d
39d0: 61 74 65 20 6d 6f 6e 74 68 5d 5d 7d 0a 2b 09 09 ate month]]}.+..
39e0: 09 20 20 20 20 7b 20 5b 6c 69 6e 64 65 78 20 24 . { [lindex $
39f0: 6c 6f 63 61 6c 65 4e 75 6d 65 72 61 6c 73 20 5b localeNumerals [
3a00: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 ::tcl::dict::get
3a10: 20 24 64 61 74 65 20 6d 6f 6e 74 68 5d 5d 7d 0a $date month]]}.
3a20: 20 09 09 20 20 20 20 7d 0a 20 09 09 20 20 20 20 .. }. ..
3a30: 4d 20 7b 09 09 09 23 20 4d 69 6e 75 74 65 20 6f M {...# Minute o
3a40: 66 20 74 68 65 20 68 6f 75 72 20 69 6e 20 61 6c f the hour in al
3a50: 74 65 72 6e 61 74 69 76 65 0a 20 09 09 09 09 09 ternative. .....
3a60: 23 20 6e 75 6d 65 72 61 6c 73 0a 20 09 09 09 61 # numerals. ...a
3a70: 70 70 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 ppend formatStri
3a80: 6e 67 20 25 73 0a 20 09 09 09 61 70 70 65 6e 64 ng %s. ...append
3a90: 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 5c 0a substituents \.
3aa0: 20 09 09 09 20 20 20 20 7b 20 5b 6c 69 6e 64 65 ... { [linde
3ab0: 78 20 24 6c 6f 63 61 6c 65 4e 75 6d 65 72 61 6c x $localeNumeral
3ac0: 73 20 5c 0a 2d 09 09 09 09 20 20 20 5b 65 78 70 s \.-.... [exp
3ad0: 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64 r { [dict get $d
3ae0: 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 ate localSeconds
3af0: 5d 20 0a 2b 09 09 09 09 20 20 20 5b 65 78 70 72 ] .+.... [expr
3b00: 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a { [::tcl::dict:
3b10: 3a 67 65 74 20 24 64 61 74 65 20 6c 6f 63 61 6c :get $date local
3b20: 53 65 63 6f 6e 64 73 5d 20 0a 20 09 09 09 09 09 Seconds] . .....
3b30: 20 20 20 2f 20 36 30 0a 20 09 09 09 09 09 20 20 / 60. .....
3b40: 20 25 20 36 30 20 7d 5d 5d 7d 0a 20 09 09 20 20 % 60 }]]}. ..
3b50: 20 20 7d 0a 40 40 20 2d 31 31 33 31 2c 37 20 2b }.@@ -1131,7 +
3b60: 31 31 33 31 2c 37 20 40 40 0d 0a 20 09 09 09 61 1131,7 @@.. ...a
3b70: 70 70 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 ppend formatStri
3b80: 6e 67 20 25 73 0a 20 09 09 09 61 70 70 65 6e 64 ng %s. ...append
3b90: 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 5c 0a substituents \.
3ba0: 20 09 09 09 20 20 20 20 7b 20 5b 6c 69 6e 64 65 ... { [linde
3bb0: 78 20 24 6c 6f 63 61 6c 65 4e 75 6d 65 72 61 6c x $localeNumeral
3bc0: 73 20 5c 0a 2d 09 09 09 09 20 20 20 5b 65 78 70 s \.-.... [exp
3bd0: 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64 r { [dict get $d
3be0: 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 ate localSeconds
3bf0: 5d 20 0a 2b 09 09 09 09 20 20 20 5b 65 78 70 72 ] .+.... [expr
3c00: 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a { [::tcl::dict:
3c10: 3a 67 65 74 20 24 64 61 74 65 20 6c 6f 63 61 6c :get $date local
3c20: 53 65 63 6f 6e 64 73 5d 20 0a 20 09 09 09 09 09 Seconds] . .....
3c30: 20 20 20 25 20 36 30 20 7d 5d 5d 7d 0a 20 09 09 % 60 }]]}. ..
3c40: 20 20 20 20 7d 0a 20 09 09 20 20 20 20 75 20 7b }. .. u {
3c50: 09 09 09 23 20 44 61 79 20 6f 66 20 74 68 65 20 ...# Day of the
3c60: 77 65 65 6b 20 28 4d 6f 6e 64 61 79 3d 31 2c 53 week (Monday=1,S
3c70: 75 6e 64 61 79 3d 37 29 0a 40 40 20 2d 31 31 33 unday=7).@@ -113
3c80: 39 2c 32 31 20 2b 31 31 33 39 2c 32 31 20 40 40 9,21 +1139,21 @@
3c90: 0d 0a 20 09 09 09 61 70 70 65 6e 64 20 66 6f 72 .. ...append for
3ca0: 6d 61 74 53 74 72 69 6e 67 20 25 73 0a 20 09 09 matString %s. ..
3cb0: 09 61 70 70 65 6e 64 20 73 75 62 73 74 69 74 75 .append substitu
3cc0: 65 6e 74 73 20 5c 0a 20 09 09 09 20 20 20 20 7b ents \. ... {
3cd0: 20 5b 6c 69 6e 64 65 78 20 24 6c 6f 63 61 6c 65 [lindex $locale
3ce0: 4e 75 6d 65 72 61 6c 73 20 5c 0a 2d 09 09 09 09 Numerals \.-....
3cf0: 20 20 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 [dict get $da
3d00: 74 65 20 64 61 79 4f 66 57 65 65 6b 5d 5d 7d 0a te dayOfWeek]]}.
3d10: 2b 09 09 09 09 20 20 20 5b 3a 3a 74 63 6c 3a 3a +.... [::tcl::
3d20: 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 dict::get $date
3d30: 64 61 79 4f 66 57 65 65 6b 5d 5d 7d 0a 20 09 09 dayOfWeek]]}. ..
3d40: 09 7d 0a 20 09 09 20 20 20 20 77 20 7b 09 09 09 .}. .. w {...
3d50: 23 20 44 61 79 20 6f 66 20 74 68 65 20 77 65 65 # Day of the wee
3d60: 6b 20 28 53 75 6e 64 61 79 3d 30 2c 53 61 74 75 k (Sunday=0,Satu
3d70: 72 64 61 79 3d 36 29 0a 20 09 09 09 09 09 23 20 rday=6). .....#
3d80: 69 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6e in alternative n
3d90: 75 6d 65 72 61 6c 73 0a 20 09 09 09 61 70 70 65 umerals. ...appe
3da0: 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67 20 nd formatString
3db0: 25 73 0a 20 09 09 09 61 70 70 65 6e 64 20 73 75 %s. ...append su
3dc0: 62 73 74 69 74 75 65 6e 74 73 20 5c 0a 20 09 09 bstituents \. ..
3dd0: 09 20 20 20 20 7b 20 5b 6c 69 6e 64 65 78 20 24 . { [lindex $
3de0: 6c 6f 63 61 6c 65 4e 75 6d 65 72 61 6c 73 20 5c localeNumerals \
3df0: 0a 2d 09 09 09 09 20 20 20 5b 65 78 70 72 20 7b .-.... [expr {
3e00: 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65 [dict get $date
3e10: 20 64 61 79 4f 66 57 65 65 6b 5d 20 25 20 37 20 dayOfWeek] % 7
3e20: 7d 5d 5d 7d 0a 2b 09 09 09 09 20 20 20 5b 65 78 }]]}.+.... [ex
3e30: 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 pr { [::tcl::dic
3e40: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 64 61 79 t::get $date day
3e50: 4f 66 57 65 65 6b 5d 20 25 20 37 20 7d 5d 5d 7d OfWeek] % 7 }]]}
3e60: 0a 20 09 09 20 20 20 20 7d 0a 20 09 09 20 20 20 . .. }. ..
3e70: 20 79 20 7b 09 09 09 23 20 59 65 61 72 20 6f 66 y {...# Year of
3e80: 20 74 68 65 20 63 65 6e 74 75 72 79 20 69 6e 20 the century in
3e90: 61 6c 74 65 72 6e 61 74 69 76 65 0a 20 09 09 09 alternative. ...
3ea0: 09 09 23 20 6e 75 6d 65 72 61 6c 73 0a 20 09 09 ..# numerals. ..
3eb0: 09 61 70 70 65 6e 64 20 66 6f 72 6d 61 74 53 74 .append formatSt
3ec0: 72 69 6e 67 20 25 73 0a 20 09 09 09 61 70 70 65 ring %s. ...appe
3ed0: 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 nd substituents
3ee0: 5c 0a 20 09 09 09 20 20 20 20 7b 20 5b 6c 69 6e \. ... { [lin
3ef0: 64 65 78 20 24 6c 6f 63 61 6c 65 4e 75 6d 65 72 dex $localeNumer
3f00: 61 6c 73 20 5c 0a 2d 09 09 09 09 20 20 20 5b 65 als \.-.... [e
3f10: 78 70 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 xpr { [dict get
3f20: 24 64 61 74 65 20 79 65 61 72 5d 20 25 20 31 30 $date year] % 10
3f30: 30 20 7d 5d 5d 7d 0a 2b 09 09 09 09 20 20 20 5b 0 }]]}.+.... [
3f40: 65 78 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 expr { [::tcl::d
3f50: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 79 ict::get $date y
3f60: 65 61 72 5d 20 25 20 31 30 30 20 7d 5d 5d 7d 0a ear] % 100 }]]}.
3f70: 20 09 09 20 20 20 20 7d 0a 20 09 09 20 20 20 20 .. }. ..
3f80: 64 65 66 61 75 6c 74 20 7b 09 23 20 55 6e 6b 6e default {.# Unkn
3f90: 6f 77 6e 20 66 6f 72 6d 61 74 20 67 72 6f 75 70 own format group
3fa0: 0a 20 09 09 09 61 70 70 65 6e 64 20 66 6f 72 6d . ...append form
3fb0: 61 74 53 74 72 69 6e 67 20 25 25 4f 20 24 63 68 atString %%O $ch
3fc0: 61 72 0a 40 40 20 2d 31 32 31 33 2c 37 20 2b 31 ar.@@ -1213,7 +1
3fd0: 32 31 33 2c 37 20 40 40 0d 0a 20 20 20 20 20 20 213,7 @@..
3fe0: 20 20 20 20 20 20 20 20 5c 22 24 63 6d 64 4e 61 \"$cmdNa
3ff0: 6d 65 20 73 74 72 69 6e 67 5c 0a 20 20 20 20 20 me string\.
4000: 20 20 20 20 20 20 20 20 20 3f 2d 62 61 73 65 20 ?-base
4010: 73 65 63 6f 6e 64 73 3f 5c 0a 20 20 20 20 20 20 seconds?\.
4020: 20 20 20 20 20 20 20 20 3f 2d 66 6f 72 6d 61 74 ?-format
4030: 20 73 74 72 69 6e 67 3f 20 3f 2d 67 6d 74 20 62 string? ?-gmt b
4040: 6f 6f 6c 65 61 6e 3f 5c 0a 2d 20 20 20 20 20 20 oolean?\.-
4050: 20 20 20 20 20 20 20 3f 2d 6c 6f 63 61 6c 65 20 ?-locale
4060: 4c 4f 43 41 4c 45 3f 20 3f 2d 74 69 6d 65 7a 6f LOCALE? ?-timezo
4070: 6e 65 20 5a 4f 4e 45 3f 5c 22 22 0a 2b 20 20 20 ne ZONE?\"".+
4080: 20 20 20 20 20 20 20 20 20 20 3f 2d 6c 6f 63 61 ?-loca
4090: 6c 65 20 4c 4f 43 41 4c 45 3f 20 3f 2d 74 69 6d le LOCALE? ?-tim
40a0: 65 7a 6f 6e 65 20 5a 4f 4e 45 3f 20 3f 2d 76 61 ezone ZONE? ?-va
40b0: 6c 69 64 20 31 7c 30 3f 5c 22 22 0a 20 20 20 20 lid 1|0?\"".
40c0: 20 7d 0a 20 0a 20 20 20 20 20 23 20 53 65 74 20 }. . # Set
40d0: 64 65 66 61 75 6c 74 73 0a 40 40 20 2d 31 32 32 defaults.@@ -122
40e0: 34 2c 36 20 2b 31 32 32 34 2c 37 20 40 40 0d 0a 4,6 +1224,7 @@..
40f0: 20 20 20 20 20 73 65 74 20 67 6d 74 20 30 0a 20 set gmt 0.
4100: 20 20 20 20 73 65 74 20 6c 6f 63 61 6c 65 20 63 set locale c
4110: 0a 20 20 20 20 20 73 65 74 20 74 69 6d 65 7a 6f . set timezo
4120: 6e 65 20 5b 47 65 74 53 79 73 74 65 6d 54 69 6d ne [GetSystemTim
4130: 65 5a 6f 6e 65 5d 0a 2b 20 20 20 20 73 65 74 20 eZone].+ set
4140: 76 61 6c 69 64 61 74 65 20 31 0a 20 0a 20 20 20 validate 1. .
4150: 20 20 23 20 50 69 63 6b 20 75 70 20 63 6f 6d 6d # Pick up comm
4160: 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 and line options
4170: 2e 0a 20 0a 40 40 20 2d 31 32 34 35 2c 31 31 20 .. .@@ -1245,11
4180: 2b 31 32 34 36 2c 31 34 20 40 40 0d 0a 20 09 20 +1246,14 @@.. .
4190: 20 20 20 2d 74 20 2d 20 2d 74 69 20 2d 20 2d 74 -t - -ti - -t
41a0: 69 6d 20 2d 20 2d 74 69 6d 65 20 2d 20 2d 74 69 im - -time - -ti
41b0: 6d 65 7a 20 2d 20 2d 74 69 6d 65 7a 6f 20 2d 20 mez - -timezo -
41c0: 2d 74 69 6d 65 7a 6f 6e 20 2d 20 2d 74 69 6d 65 -timezon - -time
41d0: 7a 6f 6e 65 20 7b 0a 20 09 09 73 65 74 20 74 69 zone {. ..set ti
41e0: 6d 65 7a 6f 6e 65 20 24 76 61 6c 75 65 0a 20 09 mezone $value. .
41f0: 20 20 20 20 7d 0a 2b 09 20 20 20 20 2d 76 20 2d }.+. -v -
4200: 20 2d 76 61 6c 69 64 20 7b 0a 2b 09 09 73 65 74 -valid {.+..set
4210: 20 76 61 6c 69 64 61 74 65 20 24 76 61 6c 75 65 validate $value
4220: 0a 2b 09 20 20 20 20 7d 0a 20 09 20 20 20 20 64 .+. }. . d
4230: 65 66 61 75 6c 74 20 7b 0a 20 09 09 72 65 74 75 efault {. ..retu
4240: 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 5c rn -code error \
4250: 0a 20 09 09 20 20 20 20 2d 65 72 72 6f 72 63 6f . .. -errorco
4260: 64 65 20 5b 6c 69 73 74 20 43 4c 4f 43 4b 20 62 de [list CLOCK b
4270: 61 64 53 77 69 74 63 68 20 24 66 6c 61 67 5d 20 adSwitch $flag]
4280: 5c 0a 20 09 09 20 20 20 20 22 62 61 64 20 73 77 \. .. "bad sw
4290: 69 74 63 68 20 5c 22 24 66 6c 61 67 5c 22 2c 5c itch \"$flag\",\
42a0: 0a 2d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .-
42b0: 20 20 20 20 20 20 20 6d 75 73 74 20 62 65 20 2d must be -
42c0: 62 61 73 65 2c 20 2d 66 6f 72 6d 61 74 2c 20 2d base, -format, -
42d0: 67 6d 74 2c 20 2d 6c 6f 63 61 6c 65 20 6f 72 20 gmt, -locale or
42e0: 2d 74 69 6d 65 7a 6f 6e 65 22 0a 2b 20 20 20 20 -timezone".+
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4300: 20 6d 75 73 74 20 62 65 20 2d 62 61 73 65 2c 20 must be -base,
4310: 2d 66 6f 72 6d 61 74 2c 20 2d 67 6d 74 2c 20 2d -format, -gmt, -
4320: 6c 6f 63 61 6c 65 2c 20 2d 74 69 6d 65 7a 6f 6e locale, -timezon
4330: 65 20 6f 72 20 2d 76 61 6c 69 64 22 0a 20 09 20 e or -valid". .
4340: 20 20 20 7d 0a 20 09 7d 0a 20 20 20 20 20 7d 0a }. .}. }.
4350: 40 40 20 2d 31 32 38 33 2c 33 38 20 2b 31 32 38 @@ -1283,38 +128
4360: 37 2c 31 38 20 40 40 0d 0a 20 09 09 22 6c 65 67 7,18 @@.. .."leg
4370: 61 63 79 20 5c 5b 63 6c 6f 63 6b 20 73 63 61 6e acy \[clock scan
4380: 5c 5d 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 \] does not supp
4390: 6f 72 74 20 2d 6c 6f 63 61 6c 65 22 0a 20 0a 20 ort -locale". .
43a0: 09 7d 0a 2d 09 72 65 74 75 72 6e 20 5b 46 72 65 .}.-.return [Fre
43b0: 65 53 63 61 6e 20 24 73 74 72 69 6e 67 20 24 62 eScan $string $b
43c0: 61 73 65 20 24 74 69 6d 65 7a 6f 6e 65 20 24 6c ase $timezone $l
43d0: 6f 63 61 6c 65 5d 0a 2b 09 72 65 74 75 72 6e 20 ocale].+.return
43e0: 5b 46 72 65 65 53 63 61 6e 20 24 73 74 72 69 6e [FreeScan $strin
43f0: 67 20 24 62 61 73 65 20 24 74 69 6d 65 7a 6f 6e g $base $timezon
4400: 65 20 24 6c 6f 63 61 6c 65 20 24 76 61 6c 69 64 e $locale $valid
4410: 61 74 65 5d 0a 20 20 20 20 20 7d 0a 20 0a 2d 20 ate]. }. .-
4420: 20 20 20 23 20 43 68 61 6e 67 65 20 6c 6f 63 61 # Change loca
4430: 6c 65 20 69 66 20 61 20 66 72 65 73 68 20 6c 6f le if a fresh lo
4440: 63 61 6c 65 20 68 61 73 20 62 65 65 6e 20 67 69 cale has been gi
4450: 76 65 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 ven on the comma
4460: 6e 64 20 6c 69 6e 65 2e 0a 2d 0a 2d 20 20 20 20 nd line..-.-
4470: 45 6e 74 65 72 4c 6f 63 61 6c 65 20 24 6c 6f 63 EnterLocale $loc
4480: 61 6c 65 20 6f 6c 64 4c 6f 63 61 6c 65 0a 2d 0a ale oldLocale.-.
4490: 2d 20 20 20 20 73 65 74 20 73 74 61 74 75 73 20 - set status
44a0: 5b 63 61 74 63 68 20 7b 0a 2d 0a 2d 09 23 20 4d [catch {.-.-.# M
44b0: 61 70 20 61 77 61 79 20 74 68 65 20 6c 6f 63 61 ap away the loca
44c0: 6c 65 2d 64 65 70 65 6e 64 65 6e 74 20 63 6f 6d le-dependent com
44d0: 70 6f 73 69 74 65 20 66 6f 72 6d 61 74 20 67 72 posite format gr
44e0: 6f 75 70 73 0a 2d 0a 2d 09 73 65 74 20 73 63 61 oups.-.-.set sca
44f0: 6e 6e 65 72 20 5b 50 61 72 73 65 43 6c 6f 63 6b nner [ParseClock
4500: 53 63 61 6e 46 6f 72 6d 61 74 20 24 66 6f 72 6d ScanFormat $form
4510: 61 74 20 24 6c 6f 63 61 6c 65 5d 0a 2d 09 24 73 at $locale].-.$s
4520: 63 61 6e 6e 65 72 20 24 73 74 72 69 6e 67 20 24 canner $string $
4530: 62 61 73 65 20 24 74 69 6d 65 7a 6f 6e 65 0a 2d base $timezone.-
4540: 0a 2d 20 20 20 20 7d 20 72 65 73 75 6c 74 20 6f .- } result o
4550: 70 74 73 5d 0a 2d 0a 2d 20 20 20 20 23 20 52 65 pts].-.- # Re
4560: 73 74 6f 72 65 20 74 68 65 20 6c 6f 63 61 6c 65 store the locale
4570: 0a 2d 0a 2d 20 20 20 20 69 66 20 7b 20 5b 69 6e .-.- if { [in
4580: 66 6f 20 65 78 69 73 74 73 20 6f 6c 64 4c 6f 63 fo exists oldLoc
4590: 61 6c 65 5d 20 7d 20 7b 0a 2d 09 6d 63 6c 6f 63 ale] } {.-.mcloc
45a0: 61 6c 65 20 24 6f 6c 64 4c 6f 63 61 6c 65 0a 2b ale $oldLocale.+
45b0: 20 20 20 20 23 20 4d 61 70 20 61 77 61 79 20 74 # Map away t
45c0: 68 65 20 6c 6f 63 61 6c 65 2d 64 65 70 65 6e 64 he locale-depend
45d0: 65 6e 74 20 63 6f 6d 70 6f 73 69 74 65 20 66 6f ent composite fo
45e0: 72 6d 61 74 20 67 72 6f 75 70 73 0a 2b 20 20 20 rmat groups.+
45f0: 20 0a 2b 20 20 20 20 73 65 74 20 70 72 6f 63 4e .+ set procN
4600: 61 6d 65 20 27 24 66 6f 72 6d 61 74 27 24 6c 6f ame '$format'$lo
4610: 63 61 6c 65 0a 2b 20 20 20 20 76 61 72 69 61 62 cale.+ variab
4620: 6c 65 20 53 63 61 6e 50 72 6f 63 0a 2b 20 20 20 le ScanProc.+
4630: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 if {![info exis
4640: 74 73 20 53 63 61 6e 50 72 6f 63 28 24 70 72 6f ts ScanProc($pro
4650: 63 4e 61 6d 65 29 5d 7d 20 7b 0a 2b 20 20 20 20 cName)]} {.+
4660: 20 20 20 20 73 65 74 20 53 63 61 6e 50 72 6f 63 set ScanProc
4670: 28 24 70 72 6f 63 4e 61 6d 65 29 20 5c 0a 2b 20 ($procName) \.+
4680: 20 20 20 20 20 20 20 20 20 20 20 5b 50 61 72 73 [Pars
4690: 65 43 6c 6f 63 6b 53 63 61 6e 46 6f 72 6d 61 74 eClockScanFormat
46a0: 20 24 66 6f 72 6d 61 74 20 24 6c 6f 63 61 6c 65 $format $locale
46b0: 20 73 63 61 6e 70 72 6f 63 5b 73 74 72 69 6e 67 scanproc[string
46c0: 20 6d 61 70 20 7b 3a 20 7b 5c 3a 7d 20 5c 5c 20 map {: {\:} \\
46d0: 7b 5c 5c 7d 7d 20 24 70 72 6f 63 4e 61 6d 65 5d {\\}} $procName]
46e0: 5d 0a 20 20 20 20 20 7d 0a 2d 0a 2d 20 20 20 20 ]. }.-.-
46f0: 69 66 20 7b 20 24 73 74 61 74 75 73 20 3d 3d 20 if { $status ==
4700: 31 20 7d 20 7b 0a 2d 09 69 66 20 7b 20 5b 6c 69 1 } {.-.if { [li
4710: 6e 64 65 78 20 5b 64 69 63 74 20 67 65 74 20 24 ndex [dict get $
4720: 6f 70 74 73 20 2d 65 72 72 6f 72 63 6f 64 65 5d opts -errorcode]
4730: 20 30 5d 20 65 71 20 7b 63 6c 6f 63 6b 7d 20 7d 0] eq {clock} }
4740: 20 7b 0a 2d 09 20 20 20 20 72 65 74 75 72 6e 20 {.-. return
4750: 2d 63 6f 64 65 20 65 72 72 6f 72 20 24 72 65 73 -code error $res
4760: 75 6c 74 0a 2d 09 7d 20 65 6c 73 65 20 7b 0a 2d ult.-.} else {.-
4770: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 6f 70 74 . return -opt
4780: 69 6f 6e 73 20 24 6f 70 74 73 20 24 72 65 73 75 ions $opts $resu
4790: 6c 74 0a 2d 09 7d 0a 2d 20 20 20 20 7d 20 65 6c lt.-.}.- } el
47a0: 73 65 20 7b 0a 2d 09 72 65 74 75 72 6e 20 24 72 se {.-.return $r
47b0: 65 73 75 6c 74 0a 2d 20 20 20 20 7d 0a 2d 0a 2b esult.- }.-.+
47c0: 20 20 20 20 24 53 63 61 6e 50 72 6f 63 28 24 70 $ScanProc($p
47d0: 72 6f 63 4e 61 6d 65 29 20 24 73 74 72 69 6e 67 rocName) $string
47e0: 20 24 62 61 73 65 20 24 74 69 6d 65 7a 6f 6e 65 $base $timezone
47f0: 20 24 76 61 6c 69 64 61 74 65 0a 20 7d 0a 20 0a $validate. }. .
4800: 20 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d #--------------
4810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4840: 2d 2d 2d 2d 2d 2d 2d 2d 0a 40 40 20 2d 31 33 33 --------.@@ -133
4850: 35 2c 37 20 2b 31 33 31 39 2c 37 20 40 40 0d 0a 5,7 +1319,7 @@..
4860: 20 23 0a 20 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d #. #-----------
4870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 0a 2d 70 -----------. .-p
48b0: 72 6f 63 20 3a 3a 74 63 6c 3a 3a 63 6c 6f 63 6b roc ::tcl::clock
48c0: 3a 3a 46 72 65 65 53 63 61 6e 20 7b 20 73 74 72 ::FreeScan { str
48d0: 69 6e 67 20 62 61 73 65 20 74 69 6d 65 7a 6f 6e ing base timezon
48e0: 65 20 6c 6f 63 61 6c 65 20 7d 20 7b 0a 2b 70 72 e locale } {.+pr
48f0: 6f 63 20 3a 3a 74 63 6c 3a 3a 63 6c 6f 63 6b 3a oc ::tcl::clock:
4900: 3a 46 72 65 65 53 63 61 6e 20 7b 20 73 74 72 69 :FreeScan { stri
4910: 6e 67 20 62 61 73 65 20 74 69 6d 65 7a 6f 6e 65 ng base timezone
4920: 20 6c 6f 63 61 6c 65 20 7b 76 61 6c 69 64 61 74 locale {validat
4930: 65 20 31 7d 20 7d 20 7b 0a 20 0a 20 20 20 20 20 e 1} } {. .
4940: 76 61 72 69 61 62 6c 65 20 54 5a 44 61 74 61 0a variable TZData.
4950: 20 0a 40 40 20 2d 31 33 35 33 2c 37 20 2b 31 33 .@@ -1353,7 +13
4960: 33 37 2c 37 20 40 40 0d 0a 20 09 09 20 20 24 62 37,7 @@.. .. $b
4970: 61 73 65 20 5c 0a 20 09 09 20 20 24 54 5a 44 61 ase \. .. $TZDa
4980: 74 61 28 24 74 69 6d 65 7a 6f 6e 65 29 20 5c 0a ta($timezone) \.
4990: 20 09 09 20 20 32 33 36 31 32 32 32 5d 0a 2d 20 .. 2361222].-
49a0: 20 20 20 64 69 63 74 20 73 65 74 20 64 61 74 65 dict set date
49b0: 20 73 65 63 6f 6e 64 4f 66 44 61 79 20 5b 65 78 secondOfDay [ex
49c0: 70 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 pr { [dict get $
49d0: 64 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 date localSecond
49e0: 73 5d 20 0a 2b 20 20 20 20 64 69 63 74 20 73 65 s] .+ dict se
49f0: 74 20 64 61 74 65 20 73 65 63 6f 6e 64 4f 66 44 t date secondOfD
4a00: 61 79 20 5b 65 78 70 72 20 7b 20 5b 3a 3a 74 63 ay [expr { [::tc
4a10: 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 l::dict::get $da
4a20: 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d te localSeconds]
4a30: 20 0a 20 09 09 09 09 20 20 20 20 20 20 25 20 38 . .... % 8
4a40: 36 34 30 30 20 7d 5d 0a 20 0a 20 20 20 20 20 23 6400 }]. . #
4a50: 20 50 61 72 73 65 20 74 68 65 20 64 61 74 65 2e Parse the date.
4a60: 20 20 54 68 65 20 70 61 72 73 65 72 20 77 69 6c The parser wil
4a70: 6c 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20 l return a list
4a80: 63 6f 6d 70 72 69 73 69 6e 67 0a 40 40 20 2d 31 comprising.@@ -1
4a90: 33 36 32 2c 39 20 2b 31 33 34 36 2c 39 20 40 40 362,9 +1346,9 @@
4aa0: 0d 0a 20 0a 20 20 20 20 20 73 65 74 20 73 74 61 .. . set sta
4ab0: 74 75 73 20 5b 63 61 74 63 68 20 7b 0a 20 09 4f tus [catch {. .O
4ac0: 6c 64 73 63 61 6e 20 24 73 74 72 69 6e 67 20 5c ldscan $string \
4ad0: 0a 2d 09 20 20 20 20 5b 64 69 63 74 20 67 65 74 .-. [dict get
4ae0: 20 24 64 61 74 65 20 79 65 61 72 5d 20 5c 0a 2d $date year] \.-
4af0: 09 20 20 20 20 5b 64 69 63 74 20 67 65 74 20 24 . [dict get $
4b00: 64 61 74 65 20 6d 6f 6e 74 68 5d 20 5c 0a 2d 09 date month] \.-.
4b10: 20 20 20 20 5b 64 69 63 74 20 67 65 74 20 24 64 [dict get $d
4b20: 61 74 65 20 64 61 79 4f 66 4d 6f 6e 74 68 5d 0a ate dayOfMonth].
4b30: 2b 09 20 20 20 20 5b 3a 3a 74 63 6c 3a 3a 64 69 +. [::tcl::di
4b40: 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 79 65 ct::get $date ye
4b50: 61 72 5d 20 5c 0a 2b 09 20 20 20 20 5b 3a 3a 74 ar] \.+. [::t
4b60: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 cl::dict::get $d
4b70: 61 74 65 20 6d 6f 6e 74 68 5d 20 5c 0a 2b 09 20 ate month] \.+.
4b80: 20 20 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a [::tcl::dict:
4b90: 3a 67 65 74 20 24 64 61 74 65 20 64 61 79 4f 66 :get $date dayOf
4ba0: 4d 6f 6e 74 68 5d 0a 20 20 20 20 20 7d 20 72 65 Month]. } re
4bb0: 73 75 6c 74 5d 0a 20 20 20 20 20 69 66 20 7b 20 sult]. if {
4bc0: 24 73 74 61 74 75 73 20 21 3d 20 30 20 7d 20 7b $status != 0 } {
4bd0: 0a 20 09 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 . .return -code
4be0: 65 72 72 6f 72 20 22 75 6e 61 62 6c 65 20 74 6f error "unable to
4bf0: 20 63 6f 6e 76 65 72 74 20 64 61 74 65 2d 74 69 convert date-ti
4c00: 6d 65 20 73 74 72 69 6e 67 20 5c 22 24 73 74 72 me string \"$str
4c10: 69 6e 67 5c 22 3a 20 24 72 65 73 75 6c 74 22 0a ing\": $result".
4c20: 40 40 20 2d 31 34 32 32 2c 31 33 20 2b 31 34 30 @@ -1422,13 +140
4c30: 36 2c 32 33 20 40 40 0d 0a 20 09 64 69 63 74 20 6,23 @@.. .dict
4c40: 73 65 74 20 64 61 74 65 20 73 65 63 6f 6e 64 4f set date secondO
4c50: 66 44 61 79 20 30 0a 20 20 20 20 20 7d 0a 20 0a fDay 0. }. .
4c60: 2b 20 20 20 20 69 66 20 7b 24 76 61 6c 69 64 61 + if {$valida
4c70: 74 65 7d 20 7b 0a 2b 09 69 66 20 7b 5b 63 61 74 te} {.+.if {[cat
4c80: 63 68 20 7b 0a 2b 09 20 20 56 61 6c 69 64 44 61 ch {.+. ValidDa
4c90: 74 65 20 24 64 61 74 65 20 24 73 74 72 69 6e 67 te $date $string
4ca0: 0a 2b 09 7d 20 72 65 73 75 6c 74 20 6f 70 74 73 .+.} result opts
4cb0: 5d 7d 20 7b 0a 2b 09 20 20 69 66 20 7b 20 5b 6c ]} {.+. if { [l
4cc0: 69 6e 64 65 78 20 5b 3a 3a 74 63 6c 3a 3a 64 69 index [::tcl::di
4cd0: 63 74 3a 3a 67 65 74 20 24 6f 70 74 73 20 2d 65 ct::get $opts -e
4ce0: 72 72 6f 72 63 6f 64 65 5d 20 30 5d 20 65 71 20 rrorcode] 0] eq
4cf0: 7b 43 4c 4f 43 4b 7d 20 7d 20 7b 0a 2b 09 20 20 {CLOCK} } {.+.
4d00: 20 20 64 69 63 74 20 75 6e 73 65 74 20 6f 70 74 dict unset opt
4d10: 73 20 2d 65 72 72 6f 72 69 6e 66 6f 0a 2b 09 20 s -errorinfo.+.
4d20: 20 7d 0a 2b 09 20 20 72 65 74 75 72 6e 20 2d 6f }.+. return -o
4d30: 70 74 69 6f 6e 73 20 24 6f 70 74 73 20 2d 63 6f ptions $opts -co
4d40: 64 65 20 65 72 72 6f 72 20 2d 6c 65 76 65 6c 20 de error -level
4d50: 32 20 24 72 65 73 75 6c 74 0a 2b 09 7d 0a 2b 20 2 $result.+.}.+
4d60: 20 20 20 7d 0a 20 20 20 20 20 64 69 63 74 20 73 }. dict s
4d70: 65 74 20 64 61 74 65 20 6c 6f 63 61 6c 53 65 63 et date localSec
4d80: 6f 6e 64 73 20 5c 0a 20 09 5b 65 78 70 72 20 7b onds \. .[expr {
4d90: 20 2d 32 31 30 38 36 36 38 30 33 32 30 30 0a 2d -210866803200.-
4da0: 09 09 2b 20 28 20 38 36 34 30 30 20 2a 20 77 69 ..+ ( 86400 * wi
4db0: 64 65 28 5b 64 69 63 74 20 67 65 74 20 24 64 61 de([dict get $da
4dc0: 74 65 20 6a 75 6c 69 61 6e 44 61 79 5d 29 20 29 te julianDay]) )
4dd0: 0a 2d 09 09 2b 20 5b 64 69 63 74 20 67 65 74 20 .-..+ [dict get
4de0: 24 64 61 74 65 20 73 65 63 6f 6e 64 4f 66 44 61 $date secondOfDa
4df0: 79 5d 20 7d 5d 0a 2b 09 09 2b 20 28 20 38 36 34 y] }].+..+ ( 864
4e00: 30 30 20 2a 20 77 69 64 65 28 5b 3a 3a 74 63 6c 00 * wide([::tcl
4e10: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 ::dict::get $dat
4e20: 65 20 6a 75 6c 69 61 6e 44 61 79 5d 29 20 29 0a e julianDay]) ).
4e30: 2b 09 09 2b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 +..+ [::tcl::dic
4e40: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 73 65 63 t::get $date sec
4e50: 6f 6e 64 4f 66 44 61 79 5d 20 7d 5d 0a 20 20 20 ondOfDay] }].
4e60: 20 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20 dict set date
4e70: 74 7a 4e 61 6d 65 20 24 74 69 6d 65 7a 6f 6e 65 tzName $timezone
4e80: 0a 20 20 20 20 20 73 65 74 20 64 61 74 65 20 5b . set date [
4e90: 43 6f 6e 76 65 72 74 4c 6f 63 61 6c 54 6f 55 54 ConvertLocalToUT
4ea0: 43 20 24 64 61 74 65 5b 73 65 74 20 64 61 74 65 C $date[set date
4eb0: 20 7b 7d 5d 20 24 54 5a 44 61 74 61 28 24 74 69 {}] $TZData($ti
4ec0: 6d 65 7a 6f 6e 65 29 20 32 33 36 31 32 32 32 5d mezone) 2361222]
4ed0: 0a 2d 20 20 20 20 73 65 74 20 73 65 63 6f 6e 64 .- set second
4ee0: 73 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 s [dict get $dat
4ef0: 65 20 73 65 63 6f 6e 64 73 5d 0a 2b 20 20 20 20 e seconds].+
4f00: 73 65 74 20 73 65 63 6f 6e 64 73 20 5b 3a 3a 74 set seconds [::t
4f10: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 cl::dict::get $d
4f20: 61 74 65 20 73 65 63 6f 6e 64 73 5d 0a 20 0a 20 ate seconds]. .
4f30: 20 20 20 20 23 20 44 6f 20 72 65 6c 61 74 69 76 # Do relativ
4f40: 65 20 74 69 6d 65 73 0a 20 0a 40 40 20 2d 31 34 e times. .@@ -14
4f50: 34 37 2c 32 33 20 2b 31 34 34 31 2c 32 33 20 40 47,23 +1441,23 @
4f60: 40 0d 0a 20 09 73 65 74 20 64 61 74 65 32 20 5b @.. .set date2 [
4f70: 47 65 74 44 61 74 65 46 69 65 6c 64 73 20 24 73 GetDateFields $s
4f80: 65 63 6f 6e 64 73 20 24 54 5a 44 61 74 61 28 24 econds $TZData($
4f90: 74 69 6d 65 7a 6f 6e 65 29 20 32 33 36 31 32 32 timezone) 236122
4fa0: 32 5d 0a 20 09 64 69 63 74 20 73 65 74 20 64 61 2]. .dict set da
4fb0: 74 65 32 20 65 72 61 20 43 45 0a 20 09 73 65 74 te2 era CE. .set
4fc0: 20 6a 64 77 6b 64 61 79 20 5b 57 65 65 6b 64 61 jdwkday [Weekda
4fd0: 79 4f 6e 4f 72 42 65 66 6f 72 65 20 24 64 61 79 yOnOrBefore $day
4fe0: 4f 66 57 65 65 6b 20 5c 0a 2d 09 09 09 20 5b 65 OfWeek \.-... [e
4ff0: 78 70 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 xpr { [dict get
5000: 24 64 61 74 65 32 20 6a 75 6c 69 61 6e 44 61 79 $date2 julianDay
5010: 5d 20 0a 2b 09 09 09 20 5b 65 78 70 72 20 7b 20 ] .+... [expr {
5020: 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 [::tcl::dict::ge
5030: 74 20 24 64 61 74 65 32 20 6a 75 6c 69 61 6e 44 t $date2 julianD
5040: 61 79 5d 20 0a 20 09 09 09 09 20 2b 20 36 20 7d ay] . .... + 6 }
5050: 5d 5d 0a 20 09 69 6e 63 72 20 6a 64 77 6b 64 61 ]]. .incr jdwkda
5060: 79 20 5b 65 78 70 72 20 7b 20 37 20 2a 20 24 64 y [expr { 7 * $d
5070: 61 79 4f 72 64 69 6e 61 6c 20 7d 5d 0a 20 09 69 ayOrdinal }]. .i
5080: 66 20 7b 20 24 64 61 79 4f 72 64 69 6e 61 6c 20 f { $dayOrdinal
5090: 3e 20 30 20 7d 20 7b 0a 20 09 20 20 20 20 69 6e > 0 } {. . in
50a0: 63 72 20 6a 64 77 6b 64 61 79 20 2d 37 0a 20 09 cr jdwkday -7. .
50b0: 7d 0a 20 09 64 69 63 74 20 73 65 74 20 64 61 74 }. .dict set dat
50c0: 65 32 20 73 65 63 6f 6e 64 4f 66 44 61 79 20 5c e2 secondOfDay \
50d0: 0a 2d 09 20 20 20 20 5b 65 78 70 72 20 7b 20 5b .-. [expr { [
50e0: 64 69 63 74 20 67 65 74 20 24 64 61 74 65 32 20 dict get $date2
50f0: 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d 20 25 20 localSeconds] %
5100: 38 36 34 30 30 20 7d 5d 0a 2b 09 20 20 20 20 5b 86400 }].+. [
5110: 65 78 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 expr { [::tcl::d
5120: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 32 20 ict::get $date2
5130: 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d 20 25 20 localSeconds] %
5140: 38 36 34 30 30 20 7d 5d 0a 20 09 64 69 63 74 20 86400 }]. .dict
5150: 73 65 74 20 64 61 74 65 32 20 6a 75 6c 69 61 6e set date2 julian
5160: 44 61 79 20 24 6a 64 77 6b 64 61 79 0a 20 09 64 Day $jdwkday. .d
5170: 69 63 74 20 73 65 74 20 64 61 74 65 32 20 6c 6f ict set date2 lo
5180: 63 61 6c 53 65 63 6f 6e 64 73 20 5c 0a 20 09 20 calSeconds \. .
5190: 20 20 20 5b 65 78 70 72 20 7b 20 2d 32 31 30 38 [expr { -2108
51a0: 36 36 38 30 33 32 30 30 0a 2d 09 09 20 20 20 20 66803200.-..
51b0: 2b 20 28 20 38 36 34 30 30 20 2a 20 77 69 64 65 + ( 86400 * wide
51c0: 28 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65 ([dict get $date
51d0: 32 20 6a 75 6c 69 61 6e 44 61 79 5d 29 20 29 0a 2 julianDay]) ).
51e0: 2d 09 09 20 20 20 20 2b 20 5b 64 69 63 74 20 67 -.. + [dict g
51f0: 65 74 20 24 64 61 74 65 20 73 65 63 6f 6e 64 4f et $date secondO
5200: 66 44 61 79 5d 20 7d 5d 0a 2b 09 09 20 20 20 20 fDay] }].+..
5210: 2b 20 28 20 38 36 34 30 30 20 2a 20 77 69 64 65 + ( 86400 * wide
5220: 28 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 ([::tcl::dict::g
5230: 65 74 20 24 64 61 74 65 32 20 6a 75 6c 69 61 6e et $date2 julian
5240: 44 61 79 5d 29 20 29 0a 2b 09 09 20 20 20 20 2b Day]) ).+.. +
5250: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 [::tcl::dict::g
5260: 65 74 20 24 64 61 74 65 20 73 65 63 6f 6e 64 4f et $date secondO
5270: 66 44 61 79 5d 20 7d 5d 0a 20 09 64 69 63 74 20 fDay] }]. .dict
5280: 73 65 74 20 64 61 74 65 32 20 74 7a 4e 61 6d 65 set date2 tzName
5290: 20 24 74 69 6d 65 7a 6f 6e 65 0a 20 09 73 65 74 $timezone. .set
52a0: 20 64 61 74 65 32 20 5b 43 6f 6e 76 65 72 74 4c date2 [ConvertL
52b0: 6f 63 61 6c 54 6f 55 54 43 20 24 64 61 74 65 32 ocalToUTC $date2
52c0: 5b 73 65 74 20 64 61 74 65 32 20 7b 7d 5d 20 24 [set date2 {}] $
52d0: 54 5a 44 61 74 61 28 24 74 69 6d 65 7a 6f 6e 65 TZData($timezone
52e0: 29 20 5c 0a 20 09 09 20 20 20 20 20 20 20 32 33 ) \. .. 23
52f0: 36 31 32 32 32 5d 0a 2d 09 73 65 74 20 73 65 63 61222].-.set sec
5300: 6f 6e 64 73 20 5b 64 69 63 74 20 67 65 74 20 24 onds [dict get $
5310: 64 61 74 65 32 20 73 65 63 6f 6e 64 73 5d 0a 2b date2 seconds].+
5320: 09 73 65 74 20 73 65 63 6f 6e 64 73 20 5b 3a 3a .set seconds [::
5330: 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 tcl::dict::get $
5340: 64 61 74 65 32 20 73 65 63 6f 6e 64 73 5d 0a 20 date2 seconds].
5350: 0a 20 20 20 20 20 7d 0a 20 0a 40 40 20 2d 31 34 . }. .@@ -14
5360: 37 33 2c 31 33 20 2b 31 34 36 37 2c 31 33 20 40 73,13 +1467,13 @
5370: 40 0d 0a 20 0a 20 09 6c 61 73 73 69 67 6e 20 24 @.. . .lassign $
5380: 70 61 72 73 65 4f 72 64 69 6e 61 6c 4d 6f 6e 74 parseOrdinalMont
5390: 68 20 6d 6f 6e 74 68 4f 72 64 69 6e 61 6c 20 6d h monthOrdinal m
53a0: 6f 6e 74 68 4e 75 6d 62 65 72 0a 20 09 69 66 20 onthNumber. .if
53b0: 7b 20 24 6d 6f 6e 74 68 4f 72 64 69 6e 61 6c 20 { $monthOrdinal
53c0: 3e 20 30 20 7d 20 7b 0a 2d 09 20 20 20 20 73 65 > 0 } {.-. se
53d0: 74 20 6d 6f 6e 74 68 44 69 66 66 20 5b 65 78 70 t monthDiff [exp
53e0: 72 20 7b 20 24 6d 6f 6e 74 68 4e 75 6d 62 65 72 r { $monthNumber
53f0: 20 2d 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 - [dict get $da
5400: 74 65 20 6d 6f 6e 74 68 5d 20 7d 5d 0a 2b 09 20 te month] }].+.
5410: 20 20 20 73 65 74 20 6d 6f 6e 74 68 44 69 66 66 set monthDiff
5420: 20 5b 65 78 70 72 20 7b 20 24 6d 6f 6e 74 68 4e [expr { $monthN
5430: 75 6d 62 65 72 20 2d 20 5b 3a 3a 74 63 6c 3a 3a umber - [::tcl::
5440: 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 dict::get $date
5450: 6d 6f 6e 74 68 5d 20 7d 5d 0a 20 09 20 20 20 20 month] }]. .
5460: 69 66 20 7b 20 24 6d 6f 6e 74 68 44 69 66 66 20 if { $monthDiff
5470: 3c 3d 20 30 20 7d 20 7b 0a 20 09 09 69 6e 63 72 <= 0 } {. ..incr
5480: 20 6d 6f 6e 74 68 44 69 66 66 20 31 32 0a 20 09 monthDiff 12. .
5490: 20 20 20 20 7d 0a 20 09 20 20 20 20 69 6e 63 72 }. . incr
54a0: 20 6d 6f 6e 74 68 4f 72 64 69 6e 61 6c 20 2d 31 monthOrdinal -1
54b0: 0a 20 09 7d 20 65 6c 73 65 20 7b 0a 2d 09 20 20 . .} else {.-.
54c0: 20 20 73 65 74 20 6d 6f 6e 74 68 44 69 66 66 20 set monthDiff
54d0: 5b 65 78 70 72 20 7b 20 5b 64 69 63 74 20 67 65 [expr { [dict ge
54e0: 74 20 24 64 61 74 65 20 6d 6f 6e 74 68 5d 20 2d t $date month] -
54f0: 20 24 6d 6f 6e 74 68 4e 75 6d 62 65 72 20 7d 5d $monthNumber }]
5500: 0a 2b 09 20 20 20 20 73 65 74 20 6d 6f 6e 74 68 .+. set month
5510: 44 69 66 66 20 5b 65 78 70 72 20 7b 20 5b 3a 3a Diff [expr { [::
5520: 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 tcl::dict::get $
5530: 64 61 74 65 20 6d 6f 6e 74 68 5d 20 2d 20 24 6d date month] - $m
5540: 6f 6e 74 68 4e 75 6d 62 65 72 20 7d 5d 0a 20 09 onthNumber }]. .
5550: 20 20 20 20 69 66 20 7b 20 24 6d 6f 6e 74 68 44 if { $monthD
5560: 69 66 66 20 3e 3d 20 30 20 7d 20 7b 0a 20 09 09 iff >= 0 } {. ..
5570: 69 6e 63 72 20 6d 6f 6e 74 68 44 69 66 66 20 2d incr monthDiff -
5580: 31 32 0a 20 09 20 20 20 20 7d 0a 40 40 20 2d 31 12. . }.@@ -1
5590: 35 32 35 2c 31 37 20 2b 31 35 31 39 2c 35 30 20 525,17 +1519,50
55a0: 40 40 0d 0a 20 23 0a 20 23 2d 2d 2d 2d 2d 2d 2d @@.. #. #-------
55b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
55f0: 20 0a 2d 70 72 6f 63 20 3a 3a 74 63 6c 3a 3a 63 .-proc ::tcl::c
5600: 6c 6f 63 6b 3a 3a 50 61 72 73 65 43 6c 6f 63 6b lock::ParseClock
5610: 53 63 61 6e 46 6f 72 6d 61 74 20 7b 66 6f 72 6d ScanFormat {form
5620: 61 74 53 74 72 69 6e 67 20 6c 6f 63 61 6c 65 7d atString locale}
5630: 20 7b 0a 2b 70 72 6f 63 20 3a 3a 74 63 6c 3a 3a {.+proc ::tcl::
5640: 63 6c 6f 63 6b 3a 3a 50 61 72 73 65 43 6c 6f 63 clock::ParseCloc
5650: 6b 53 63 61 6e 46 6f 72 6d 61 74 20 7b 66 6f 72 kScanFormat {for
5660: 6d 61 74 53 74 72 69 6e 67 20 6c 6f 63 61 6c 65 matString locale
5670: 20 70 72 6f 63 4e 61 6d 65 7d 20 7b 0a 20 0a 20 procName} {. .
5680: 20 20 20 20 23 20 43 68 65 63 6b 20 77 68 65 74 # Check whet
5690: 68 65 72 20 74 68 65 20 66 6f 72 6d 61 74 20 68 her the format h
56a0: 61 73 20 62 65 65 6e 20 70 61 72 73 65 64 20 70 as been parsed p
56b0: 72 65 76 69 6f 75 73 6c 79 2c 20 61 6e 64 20 72 reviously, and r
56c0: 65 74 75 72 6e 0a 20 20 20 20 20 23 20 74 68 65 eturn. # the
56d0: 20 65 78 69 73 74 69 6e 67 20 72 65 63 6f 67 6e existing recogn
56e0: 69 7a 65 72 20 69 66 20 69 74 20 68 61 73 2e 0a izer if it has..
56f0: 2d 0a 2d 20 20 20 20 73 65 74 20 70 72 6f 63 4e -.- set procN
5700: 61 6d 65 20 73 63 61 6e 70 72 6f 63 27 24 66 6f ame scanproc'$fo
5710: 72 6d 61 74 53 74 72 69 6e 67 27 24 6c 6f 63 61 rmatString'$loca
5720: 6c 65 0a 2d 20 20 20 20 73 65 74 20 70 72 6f 63 le.- set proc
5730: 4e 61 6d 65 20 5b 6e 61 6d 65 73 70 61 63 65 20 Name [namespace
5740: 63 75 72 72 65 6e 74 5d 3a 3a 5b 73 74 72 69 6e current]::[strin
5750: 67 20 6d 61 70 20 7b 3a 20 7b 5c 3a 7d 20 5c 5c g map {: {\:} \\
5760: 20 7b 5c 5c 7d 7d 20 24 70 72 6f 63 4e 61 6d 65 {\\}} $procName
5770: 5d 0a 2d 20 20 20 20 69 66 20 7b 20 5b 6e 61 6d ].- if { [nam
5780: 65 73 70 61 63 65 20 77 68 69 63 68 20 24 70 72 espace which $pr
5790: 6f 63 4e 61 6d 65 5d 20 21 3d 20 7b 7d 20 7d 20 ocName] != {} }
57a0: 7b 0a 2b 20 20 20 20 69 66 20 7b 5b 6e 61 6d 65 {.+ if {[name
57b0: 73 70 61 63 65 20 77 68 69 63 68 20 24 70 72 6f space which $pro
57c0: 63 4e 61 6d 65 5d 20 6e 65 20 7b 7d 7d 20 7b 0a cName] ne {}} {.
57d0: 20 09 72 65 74 75 72 6e 20 24 70 72 6f 63 4e 61 .return $procNa
57e0: 6d 65 0a 20 20 20 20 20 7d 0a 20 0a 2b 20 20 20 me. }. .+
57f0: 20 23 20 4d 61 70 20 61 77 61 79 20 74 68 65 20 # Map away the
5800: 6c 6f 63 61 6c 65 2d 64 65 70 65 6e 64 65 6e 74 locale-dependent
5810: 20 63 6f 6d 70 6f 73 69 74 65 20 66 6f 72 6d 61 composite forma
5820: 74 20 67 72 6f 75 70 73 0a 2b 20 20 20 20 0a 2b t groups.+ .+
5830: 20 20 20 20 69 66 20 7b 20 24 6c 6f 63 61 6c 65 if { $locale
5840: 20 6e 65 20 7b 63 7d 20 26 26 20 24 6c 6f 63 61 ne {c} && $loca
5850: 6c 65 20 6e 65 20 5b 6d 63 6c 6f 63 61 6c 65 5d le ne [mclocale]
5860: 20 7d 20 7b 0a 2b 20 20 20 20 20 20 45 6e 74 65 } {.+ Ente
5870: 72 4c 6f 63 61 6c 65 20 24 6c 6f 63 61 6c 65 20 rLocale $locale
5880: 6f 6c 64 4c 6f 63 61 6c 65 0a 2b 20 20 20 20 7d oldLocale.+ }
5890: 0a 2b 0a 2b 20 20 20 20 23 20 43 68 61 6e 67 65 .+.+ # Change
58a0: 20 6c 6f 63 61 6c 65 20 69 66 20 61 20 66 72 65 locale if a fre
58b0: 73 68 20 6c 6f 63 61 6c 65 20 68 61 73 20 62 65 sh locale has be
58c0: 65 6e 20 67 69 76 65 6e 20 6f 6e 20 74 68 65 20 en given on the
58d0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 0a 2b 0a command line..+.
58e0: 2b 20 20 20 20 73 65 74 20 73 74 61 74 75 73 20 + set status
58f0: 5b 63 61 74 63 68 20 7b 0a 2b 0a 2b 09 50 61 72 [catch {.+.+.Par
5900: 73 65 43 6c 6f 63 6b 53 63 61 6e 46 6f 72 6d 61 seClockScanForma
5910: 74 32 20 24 66 6f 72 6d 61 74 53 74 72 69 6e 67 t2 $formatString
5920: 20 24 6c 6f 63 61 6c 65 20 24 70 72 6f 63 4e 61 $locale $procNa
5930: 6d 65 0a 2b 0a 2b 20 20 20 20 7d 20 72 65 73 75 me.+.+ } resu
5940: 6c 74 20 6f 70 74 73 5d 0a 2b 0a 2b 20 20 20 20 lt opts].+.+
5950: 23 20 52 65 73 74 6f 72 65 20 74 68 65 20 6c 6f # Restore the lo
5960: 63 61 6c 65 0a 2b 0a 2b 20 20 20 20 69 66 20 7b cale.+.+ if {
5970: 20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 6f 6c [info exists ol
5980: 64 4c 6f 63 61 6c 65 5d 20 7d 20 7b 0a 2b 09 6d dLocale] } {.+.m
5990: 63 6c 6f 63 61 6c 65 20 24 6f 6c 64 4c 6f 63 61 clocale $oldLoca
59a0: 6c 65 0a 2b 20 20 20 20 7d 0a 2b 0a 2b 20 20 20 le.+ }.+.+
59b0: 20 23 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 # Return either
59c0: 20 74 68 65 20 65 72 72 6f 72 20 6f 72 20 74 68 the error or th
59d0: 65 20 70 72 6f 63 20 6e 61 6d 65 0a 2b 0a 2b 20 e proc name.+.+
59e0: 20 20 20 69 66 20 7b 20 24 73 74 61 74 75 73 20 if { $status
59f0: 3d 3d 20 31 20 7d 20 7b 0a 2b 09 69 66 20 7b 20 == 1 } {.+.if {
5a00: 5b 6c 69 6e 64 65 78 20 5b 3a 3a 74 63 6c 3a 3a [lindex [::tcl::
5a10: 64 69 63 74 3a 3a 67 65 74 20 24 6f 70 74 73 20 dict::get $opts
5a20: 2d 65 72 72 6f 72 63 6f 64 65 5d 20 30 5d 20 65 -errorcode] 0] e
5a30: 71 20 7b 43 4c 4f 43 4b 7d 20 7d 20 7b 0a 2b 09 q {CLOCK} } {.+.
5a40: 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 return -code
5a50: 20 65 72 72 6f 72 20 24 72 65 73 75 6c 74 0a 2b error $result.+
5a60: 09 7d 20 65 6c 73 65 20 7b 0a 2b 09 20 20 20 20 .} else {.+.
5a70: 72 65 74 75 72 6e 20 2d 6f 70 74 69 6f 6e 73 20 return -options
5a80: 24 6f 70 74 73 20 24 72 65 73 75 6c 74 0a 2b 09 $opts $result.+.
5a90: 7d 0a 2b 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a }.+ } else {.
5aa0: 2b 09 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 +.return $result
5ab0: 0a 2b 20 20 20 20 7d 0a 2b 0a 2b 7d 0a 2b 0a 2b .+ }.+.+}.+.+
5ac0: 70 72 6f 63 20 3a 3a 74 63 6c 3a 3a 63 6c 6f 63 proc ::tcl::cloc
5ad0: 6b 3a 3a 50 61 72 73 65 43 6c 6f 63 6b 53 63 61 k::ParseClockSca
5ae0: 6e 46 6f 72 6d 61 74 32 20 7b 66 6f 72 6d 61 74 nFormat2 {format
5af0: 53 74 72 69 6e 67 20 6c 6f 63 61 6c 65 20 70 72 String locale pr
5b00: 6f 63 4e 61 6d 65 7d 20 7b 0a 2b 0a 20 20 20 20 ocName} {.+.
5b10: 20 76 61 72 69 61 62 6c 65 20 44 61 74 65 50 61 variable DatePa
5b20: 72 73 65 41 63 74 69 6f 6e 73 0a 20 20 20 20 20 rseActions.
5b30: 76 61 72 69 61 62 6c 65 20 54 69 6d 65 50 61 72 variable TimePar
5b40: 73 65 41 63 74 69 6f 6e 73 0a 20 0a 40 40 20 2d seActions. .@@ -
5b50: 31 35 35 38 2c 37 20 2b 31 35 38 35 2c 37 20 40 1558,7 +1585,7 @
5b60: 40 0d 0a 20 20 20 20 20 73 65 74 20 72 65 20 7b @.. set re {
5b70: 5e 5b 5b 3a 73 70 61 63 65 3a 5d 5d 2a 7d 0a 20 ^[[:space:]]*}.
5b80: 20 20 20 20 73 65 74 20 63 61 70 74 75 72 65 43 set captureC
5b90: 6f 75 6e 74 20 30 0a 20 20 20 20 20 73 65 74 20 ount 0. set
5ba0: 70 6f 73 74 63 6f 64 65 20 7b 7d 0a 2d 20 20 20 postcode {}.-
5bb0: 20 73 65 74 20 66 69 65 6c 64 53 65 74 20 5b 64 set fieldSet [d
5bc0: 69 63 74 20 63 72 65 61 74 65 5d 0a 2b 20 20 20 ict create].+
5bd0: 20 73 65 74 20 66 69 65 6c 64 53 65 74 20 5b 3a set fieldSet [:
5be0: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 63 72 65 61 :tcl::dict::crea
5bf0: 74 65 5d 0a 20 20 20 20 20 73 65 74 20 66 69 65 te]. set fie
5c00: 6c 64 43 6f 75 6e 74 20 30 0a 20 20 20 20 20 73 ldCount 0. s
5c10: 65 74 20 70 6f 73 74 53 65 70 20 7b 7d 0a 20 20 et postSep {}.
5c20: 20 20 20 73 65 74 20 73 74 61 74 65 20 7b 7d 0a set state {}.
5c30: 40 40 20 2d 31 39 33 37 2c 37 20 2b 31 39 36 34 @@ -1937,7 +1964
5c40: 2c 37 20 40 40 0d 0a 20 09 09 09 6c 61 73 73 69 ,7 @@.. ...lassi
5c50: 67 6e 20 5b 4c 6f 63 61 6c 65 4e 75 6d 65 72 61 gn [LocaleNumera
5c60: 6c 4d 61 74 63 68 65 72 20 24 6c 6f 63 61 6c 65 lMatcher $locale
5c70: 5d 20 72 65 67 65 78 20 6c 6f 6f 6b 75 70 0a 20 ] regex lookup.
5c80: 09 09 09 61 70 70 65 6e 64 20 72 65 20 24 72 65 ...append re $re
5c90: 67 65 78 0a 20 09 09 09 64 69 63 74 20 73 65 74 gex. ...dict set
5ca0: 20 66 69 65 6c 64 53 65 74 20 64 61 79 4f 66 57 fieldSet dayOfW
5cb0: 65 65 6b 20 5b 69 6e 63 72 20 66 69 65 6c 64 43 eek [incr fieldC
5cc0: 6f 75 6e 74 5d 0a 2d 09 09 09 61 70 70 65 6e 64 ount].-...append
5cd0: 20 70 6f 73 74 63 6f 64 65 20 22 73 65 74 20 64 postcode "set d
5ce0: 6f 77 20 5c 5b 64 69 63 74 20 67 65 74 20 22 20 ow \[dict get "
5cf0: 5b 6c 69 73 74 20 24 6c 6f 6f 6b 75 70 5d 20 5c [list $lookup] \
5d00: 0a 2b 09 09 09 61 70 70 65 6e 64 20 70 6f 73 74 .+...append post
5d10: 63 6f 64 65 20 22 73 65 74 20 64 6f 77 20 5c 5b code "set dow \[
5d20: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 ::tcl::dict::get
5d30: 20 22 20 5b 6c 69 73 74 20 24 6c 6f 6f 6b 75 70 " [list $lookup
5d40: 5d 20 5c 0a 20 09 09 09 20 20 20 20 7b 20 24 66 ] \. ... { $f
5d50: 69 65 6c 64 7d 20 5b 69 6e 63 72 20 63 61 70 74 ield} [incr capt
5d60: 75 72 65 43 6f 75 6e 74 5d 20 5c 5d 20 5c 6e 20 ureCount] \] \n
5d70: 5c 0a 20 09 09 09 20 20 20 20 7b 0a 20 09 09 09 \. ... {. ...
5d80: 09 69 66 20 7b 20 24 64 6f 77 20 3d 3d 20 30 20 .if { $dow == 0
5d90: 7d 20 7b 0a 40 40 20 2d 31 39 38 39 2c 31 38 20 } {.@@ -1989,18
5da0: 2b 32 30 31 36 2c 31 38 20 40 40 0d 0a 20 09 20 +2016,18 @@.. .
5db0: 20 20 20 7b 69 6e 70 75 74 20 73 74 72 69 6e 67 {input string
5dc0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 does not match
5dd0: 73 75 70 70 6c 69 65 64 20 66 6f 72 6d 61 74 7d supplied format}
5de0: 0a 20 20 20 20 20 7d 0a 20 20 20 20 20 61 70 70 . }. app
5df0: 65 6e 64 20 70 72 6f 63 42 6f 64 79 20 5c 7d 5c end procBody \}\
5e00: 6e 0a 2d 20 20 20 20 61 70 70 65 6e 64 20 70 72 n.- append pr
5e10: 6f 63 42 6f 64 79 20 22 73 65 74 20 64 61 74 65 ocBody "set date
5e20: 20 5c 5b 64 69 63 74 20 63 72 65 61 74 65 5c 5d \[dict create\]
5e30: 22 20 5c 6e 0a 2b 20 20 20 20 61 70 70 65 6e 64 " \n.+ append
5e40: 20 70 72 6f 63 42 6f 64 79 20 22 73 65 74 20 64 procBody "set d
5e50: 61 74 65 20 5c 5b 3a 3a 74 63 6c 3a 3a 64 69 63 ate \[::tcl::dic
5e60: 74 3a 3a 63 72 65 61 74 65 5c 5d 22 20 5c 6e 0a t::create\]" \n.
5e70: 20 20 20 20 20 61 70 70 65 6e 64 20 70 72 6f 63 append proc
5e80: 42 6f 64 79 20 7b 64 69 63 74 20 73 65 74 20 64 Body {dict set d
5e90: 61 74 65 20 74 7a 4e 61 6d 65 20 24 74 69 6d 65 ate tzName $time
5ea0: 5a 6f 6e 65 7d 20 5c 6e 0a 20 20 20 20 20 61 70 Zone} \n. ap
5eb0: 70 65 6e 64 20 70 72 6f 63 42 6f 64 79 20 24 70 pend procBody $p
5ec0: 6f 73 74 63 6f 64 65 0a 20 20 20 20 20 61 70 70 ostcode. app
5ed0: 65 6e 64 20 70 72 6f 63 42 6f 64 79 20 5b 6c 69 end procBody [li
5ee0: 73 74 20 73 65 74 20 63 68 61 6e 67 65 6f 76 65 st set changeove
5ef0: 72 20 5b 6d 63 20 47 52 45 47 4f 52 49 41 4e 5f r [mc GREGORIAN_
5f00: 43 48 41 4e 47 45 5f 44 41 54 45 5d 5d 20 5c 6e CHANGE_DATE]] \n
5f10: 0a 20 0a 20 20 20 20 20 23 20 47 65 74 20 74 69 . . # Get ti
5f20: 6d 65 20 7a 6f 6e 65 20 69 66 20 6e 65 65 64 65 me zone if neede
5f30: 64 0a 20 0a 2d 20 20 20 20 69 66 20 7b 20 21 5b d. .- if { ![
5f40: 64 69 63 74 20 65 78 69 73 74 73 20 24 66 69 65 dict exists $fie
5f50: 6c 64 53 65 74 20 73 65 63 6f 6e 64 73 5d 20 0a ldSet seconds] .
5f60: 2d 09 20 26 26 20 21 5b 64 69 63 74 20 65 78 69 -. && ![dict exi
5f70: 73 74 73 20 24 66 69 65 6c 64 53 65 74 20 73 74 sts $fieldSet st
5f80: 61 72 44 61 74 65 5d 20 7d 20 7b 0a 2d 09 69 66 arDate] } {.-.if
5f90: 20 7b 20 5b 64 69 63 74 20 65 78 69 73 74 73 20 { [dict exists
5fa0: 24 66 69 65 6c 64 53 65 74 20 74 7a 4e 61 6d 65 $fieldSet tzName
5fb0: 5d 20 7d 20 7b 0a 2b 20 20 20 20 69 66 20 7b 20 ] } {.+ if {
5fc0: 21 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 ![::tcl::dict::e
5fd0: 78 69 73 74 73 20 24 66 69 65 6c 64 53 65 74 20 xists $fieldSet
5fe0: 73 65 63 6f 6e 64 73 5d 20 0a 2b 09 20 26 26 20 seconds] .+. &&
5ff0: 21 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 ![::tcl::dict::e
6000: 78 69 73 74 73 20 24 66 69 65 6c 64 53 65 74 20 xists $fieldSet
6010: 73 74 61 72 44 61 74 65 5d 20 7d 20 7b 0a 2b 09 starDate] } {.+.
6020: 69 66 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 if { [::tcl::dic
6030: 74 3a 3a 65 78 69 73 74 73 20 24 66 69 65 6c 64 t::exists $field
6040: 53 65 74 20 74 7a 4e 61 6d 65 5d 20 7d 20 7b 0a Set tzName] } {.
6050: 20 09 20 20 20 20 61 70 70 65 6e 64 20 70 72 6f . append pro
6060: 63 42 6f 64 79 20 7b 0a 2d 09 09 73 65 74 20 74 cBody {.-..set t
6070: 69 6d 65 5a 6f 6e 65 20 5b 64 69 63 74 20 67 65 imeZone [dict ge
6080: 74 20 24 64 61 74 65 20 74 7a 4e 61 6d 65 5d 0a t $date tzName].
6090: 2b 09 09 73 65 74 20 74 69 6d 65 5a 6f 6e 65 20 +..set timeZone
60a0: 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 [::tcl::dict::ge
60b0: 74 20 24 64 61 74 65 20 74 7a 4e 61 6d 65 5d 0a t $date tzName].
60c0: 20 09 20 20 20 20 7d 0a 20 09 7d 0a 20 09 61 70 . }. .}. .ap
60d0: 70 65 6e 64 20 70 72 6f 63 42 6f 64 79 20 7b 0a pend procBody {.
60e0: 40 40 20 2d 32 30 31 38 2c 33 30 20 2b 32 30 34 @@ -2018,30 +204
60f0: 35 2c 33 34 20 40 40 0d 0a 20 0a 20 20 20 20 20 5,34 @@.. .
6100: 23 20 41 73 73 65 6d 62 6c 65 20 73 65 63 6f 6e # Assemble secon
6110: 64 73 2c 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 ds, and convert
6120: 6c 6f 63 61 6c 20 6e 6f 6d 69 6e 61 6c 20 74 69 local nominal ti
6130: 6d 65 20 74 6f 20 55 54 43 2e 0a 20 0a 2d 20 20 me to UTC.. .-
6140: 20 20 69 66 20 7b 20 21 5b 64 69 63 74 20 65 78 if { ![dict ex
6150: 69 73 74 73 20 24 66 69 65 6c 64 53 65 74 20 73 ists $fieldSet s
6160: 65 63 6f 6e 64 73 5d 20 0a 2d 20 20 20 20 20 20 econds] .-
6170: 20 20 20 26 26 20 21 5b 64 69 63 74 20 65 78 69 && ![dict exi
6180: 73 74 73 20 24 66 69 65 6c 64 53 65 74 20 73 74 sts $fieldSet st
6190: 61 72 44 61 74 65 5d 20 7d 20 7b 0a 2b 20 20 20 arDate] } {.+
61a0: 20 69 66 20 7b 20 21 5b 3a 3a 74 63 6c 3a 3a 64 if { ![::tcl::d
61b0: 69 63 74 3a 3a 65 78 69 73 74 73 20 24 66 69 65 ict::exists $fie
61c0: 6c 64 53 65 74 20 73 65 63 6f 6e 64 73 5d 20 0a ldSet seconds] .
61d0: 2b 20 20 20 20 20 20 20 20 20 26 26 20 21 5b 3a + && ![:
61e0: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 73 :tcl::dict::exis
61f0: 74 73 20 24 66 69 65 6c 64 53 65 74 20 73 74 61 ts $fieldSet sta
6200: 72 44 61 74 65 5d 20 7d 20 7b 0a 20 09 61 70 70 rDate] } {. .app
6210: 65 6e 64 20 70 72 6f 63 42 6f 64 79 20 7b 0a 2d end procBody {.-
6220: 09 20 20 20 20 69 66 20 7b 20 5b 64 69 63 74 20 . if { [dict
6230: 67 65 74 20 24 64 61 74 65 20 6a 75 6c 69 61 6e get $date julian
6240: 44 61 79 5d 20 3e 20 35 33 37 33 34 38 34 20 7d Day] > 5373484 }
6250: 20 7b 0a 2b 09 20 20 20 20 69 66 20 7b 20 5b 3a {.+. if { [:
6260: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 :tcl::dict::get
6270: 24 64 61 74 65 20 6a 75 6c 69 61 6e 44 61 79 5d $date julianDay]
6280: 20 3e 20 35 33 37 33 34 38 34 20 7d 20 7b 0a 20 > 5373484 } {.
6290: 09 09 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 ..return -code e
62a0: 72 72 6f 72 20 2d 65 72 72 6f 72 63 6f 64 65 20 rror -errorcode
62b0: 5b 6c 69 73 74 20 43 4c 4f 43 4b 20 64 61 74 65 [list CLOCK date
62c0: 54 6f 6f 4c 61 72 67 65 5d 20 5c 0a 20 09 09 20 TooLarge] \. ..
62d0: 20 20 20 22 72 65 71 75 65 73 74 65 64 20 64 61 "requested da
62e0: 74 65 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 te too large to
62f0: 72 65 70 72 65 73 65 6e 74 22 0a 20 09 20 20 20 represent". .
6300: 20 7d 0a 20 09 20 20 20 20 64 69 63 74 20 73 65 }. . dict se
6310: 74 20 64 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f t date localSeco
6320: 6e 64 73 20 5c 0a 20 09 09 5b 65 78 70 72 20 7b nds \. ..[expr {
6330: 20 2d 32 31 30 38 36 36 38 30 33 32 30 30 0a 2d -210866803200.-
6340: 09 09 09 2b 20 28 20 38 36 34 30 30 20 2a 20 77 ...+ ( 86400 * w
6350: 69 64 65 28 5b 64 69 63 74 20 67 65 74 20 24 64 ide([dict get $d
6360: 61 74 65 20 6a 75 6c 69 61 6e 44 61 79 5d 29 20 ate julianDay])
6370: 29 0a 2d 09 09 09 2b 20 5b 64 69 63 74 20 67 65 ).-...+ [dict ge
6380: 74 20 24 64 61 74 65 20 73 65 63 6f 6e 64 4f 66 t $date secondOf
6390: 44 61 79 5d 20 7d 5d 0a 2b 09 09 09 2b 20 28 20 Day] }].+...+ (
63a0: 38 36 34 30 30 20 2a 20 77 69 64 65 28 5b 3a 3a 86400 * wide([::
63b0: 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 tcl::dict::get $
63c0: 64 61 74 65 20 6a 75 6c 69 61 6e 44 61 79 5d 29 date julianDay])
63d0: 20 29 0a 2b 09 09 09 2b 20 5b 3a 3a 74 63 6c 3a ).+...+ [::tcl:
63e0: 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 :dict::get $date
63f0: 20 73 65 63 6f 6e 64 4f 66 44 61 79 5d 20 7d 5d secondOfDay] }]
6400: 0a 20 09 7d 0a 20 09 61 70 70 65 6e 64 20 70 72 . .}. .append pr
6410: 6f 63 42 6f 64 79 20 7b 0a 20 09 20 20 20 20 73 ocBody {. . s
6420: 65 74 20 64 61 74 65 20 5b 3a 3a 74 63 6c 3a 3a et date [::tcl::
6430: 63 6c 6f 63 6b 3a 3a 43 6f 6e 76 65 72 74 4c 6f clock::ConvertLo
6440: 63 61 6c 54 6f 55 54 43 20 24 64 61 74 65 5b 73 calToUTC $date[s
6450: 65 74 20 64 61 74 65 20 7b 7d 5d 20 5c 0a 20 09 et date {}] \. .
6460: 09 09 20 20 24 54 5a 44 61 74 61 28 24 74 69 6d .. $TZData($tim
6470: 65 5a 6f 6e 65 29 20 5c 0a 20 09 09 09 20 20 24 eZone) \. ... $
6480: 63 68 61 6e 67 65 6f 76 65 72 5d 0a 2b 09 0a 2b changeover].+..+
6490: 09 20 20 20 20 69 66 20 7b 24 76 61 6c 69 64 61 . if {$valida
64a0: 74 65 7d 20 7b 0a 2b 09 09 56 61 6c 69 64 44 61 te} {.+..ValidDa
64b0: 74 65 20 24 64 61 74 65 20 24 73 74 72 69 6e 67 te $date $string
64c0: 0a 2b 09 20 20 20 20 7d 0a 20 09 7d 0a 20 20 20 .+. }. .}.
64d0: 20 20 7d 0a 20 0a 20 20 20 20 20 23 20 52 65 74 }. . # Ret
64e0: 75 72 6e 20 72 65 73 75 6c 74 0a 20 0a 2d 20 20 urn result. .-
64f0: 20 20 61 70 70 65 6e 64 20 70 72 6f 63 42 6f 64 append procBod
6500: 79 20 7b 72 65 74 75 72 6e 20 5b 64 69 63 74 20 y {return [dict
6510: 67 65 74 20 24 64 61 74 65 20 73 65 63 6f 6e 64 get $date second
6520: 73 5d 7d 20 5c 6e 0a 2b 20 20 20 20 61 70 70 65 s]} \n.+ appe
6530: 6e 64 20 70 72 6f 63 42 6f 64 79 20 7b 72 65 74 nd procBody {ret
6540: 75 72 6e 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 urn [::tcl::dict
6550: 3a 3a 67 65 74 20 24 64 61 74 65 20 73 65 63 6f ::get $date seco
6560: 6e 64 73 5d 7d 20 5c 6e 0a 20 0a 2d 20 20 20 20 nds]} \n. .-
6570: 70 72 6f 63 20 24 70 72 6f 63 4e 61 6d 65 20 7b proc $procName {
6580: 20 73 74 72 69 6e 67 20 62 61 73 65 54 69 6d 65 string baseTime
6590: 20 74 69 6d 65 5a 6f 6e 65 20 7d 20 24 70 72 6f timeZone } $pro
65a0: 63 42 6f 64 79 0a 2b 20 20 20 20 70 72 6f 63 20 cBody.+ proc
65b0: 24 70 72 6f 63 4e 61 6d 65 20 7b 20 73 74 72 69 $procName { stri
65c0: 6e 67 20 62 61 73 65 54 69 6d 65 20 74 69 6d 65 ng baseTime time
65d0: 5a 6f 6e 65 20 7b 76 61 6c 69 64 61 74 65 20 31 Zone {validate 1
65e0: 7d 20 7d 20 24 70 72 6f 63 42 6f 64 79 0a 20 0a } } $procBody. .
65f0: 20 20 20 20 20 23 20 70 75 74 73 20 5b 6c 69 73 # puts [lis
6600: 74 20 70 72 6f 63 20 24 70 72 6f 63 4e 61 6d 65 t proc $procName
6610: 20 5b 6c 69 73 74 20 73 74 72 69 6e 67 20 62 61 [list string ba
6620: 73 65 54 69 6d 65 20 74 69 6d 65 5a 6f 6e 65 5d seTime timeZone]
6630: 20 24 70 72 6f 63 42 6f 64 79 5d 0a 20 0a 40 40 $procBody]. .@@
6640: 20 2d 32 30 37 31 2c 37 20 2b 32 31 30 32 2c 37 -2071,7 +2102,7
6650: 20 40 40 0d 0a 20 0a 20 20 20 20 20 76 61 72 69 @@.. . vari
6660: 61 62 6c 65 20 4c 6f 63 61 6c 65 4e 75 6d 65 72 able LocaleNumer
6670: 61 6c 43 61 63 68 65 0a 20 0a 2d 20 20 20 20 69 alCache. .- i
6680: 66 20 7b 20 21 5b 64 69 63 74 20 65 78 69 73 74 f { ![dict exist
6690: 73 20 24 4c 6f 63 61 6c 65 4e 75 6d 65 72 61 6c s $LocaleNumeral
66a0: 43 61 63 68 65 20 24 6c 5d 20 7d 20 7b 0a 2b 20 Cache $l] } {.+
66b0: 20 20 20 69 66 20 7b 20 21 5b 3a 3a 74 63 6c 3a if { ![::tcl:
66c0: 3a 64 69 63 74 3a 3a 65 78 69 73 74 73 20 24 4c :dict::exists $L
66d0: 6f 63 61 6c 65 4e 75 6d 65 72 61 6c 43 61 63 68 ocaleNumeralCach
66e0: 65 20 24 6c 5d 20 7d 20 7b 0a 20 09 73 65 74 20 e $l] } {. .set
66f0: 64 20 7b 7d 0a 20 09 73 65 74 20 69 20 30 0a 20 d {}. .set i 0.
6700: 09 73 65 74 20 73 65 70 20 5c 28 0a 40 40 20 2d .set sep \(.@@ -
6710: 32 30 38 35 2c 37 20 2b 32 31 31 36 2c 37 20 40 2085,7 +2116,7 @
6720: 40 0d 0a 20 09 61 70 70 65 6e 64 20 72 65 20 5c @.. .append re \
6730: 29 0a 20 09 64 69 63 74 20 73 65 74 20 4c 6f 63 ). .dict set Loc
6740: 61 6c 65 4e 75 6d 65 72 61 6c 43 61 63 68 65 20 aleNumeralCache
6750: 24 6c 20 5b 6c 69 73 74 20 24 72 65 20 24 64 5d $l [list $re $d]
6760: 0a 20 20 20 20 20 7d 0a 2d 20 20 20 20 72 65 74 . }.- ret
6770: 75 72 6e 20 5b 64 69 63 74 20 67 65 74 20 24 4c urn [dict get $L
6780: 6f 63 61 6c 65 4e 75 6d 65 72 61 6c 43 61 63 68 ocaleNumeralCach
6790: 65 20 24 6c 5d 0a 2b 20 20 20 20 72 65 74 75 72 e $l].+ retur
67a0: 6e 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a n [::tcl::dict::
67b0: 67 65 74 20 24 4c 6f 63 61 6c 65 4e 75 6d 65 72 get $LocaleNumer
67c0: 61 6c 43 61 63 68 65 20 24 6c 5d 0a 20 7d 0a 20 alCache $l]. }.
67d0: 09 0a 20 0a 40 40 20 2d 32 31 32 31 2c 38 20 2b .. .@@ -2121,8 +
67e0: 32 31 35 32 2c 38 20 40 40 0d 0a 20 20 20 20 20 2152,8 @@..
67f0: 23 20 70 72 65 66 69 78 2e 20 20 54 68 65 20 27 # prefix. The '
6800: 70 72 65 66 69 78 4d 61 70 70 69 6e 67 27 20 64 prefixMapping' d
6810: 69 63 74 69 6f 6e 61 72 79 20 77 69 6c 6c 20 68 ictionary will h
6820: 61 76 65 20 6b 65 79 73 20 74 68 61 74 0a 20 20 ave keys that.
6830: 20 20 20 23 20 61 72 65 20 70 72 65 66 69 78 65 # are prefixe
6840: 73 20 6f 66 20 6b 65 79 73 20 61 6e 64 20 76 61 s of keys and va
6850: 6c 75 65 73 20 74 68 61 74 20 63 6f 72 72 65 73 lues that corres
6860: 70 6f 6e 64 20 74 6f 20 74 68 65 20 6b 65 79 73 pond to the keys
6870: 2e 0a 20 0a 2d 20 20 20 20 73 65 74 20 70 72 65 .. .- set pre
6880: 66 69 78 4d 61 70 70 69 6e 67 20 5b 64 69 63 74 fixMapping [dict
6890: 20 63 72 65 61 74 65 5d 0a 2d 20 20 20 20 73 65 create].- se
68a0: 74 20 73 75 63 63 65 73 73 6f 72 73 20 5b 64 69 t successors [di
68b0: 63 74 20 63 72 65 61 74 65 20 7b 7d 20 7b 7d 5d ct create {} {}]
68c0: 0a 2b 20 20 20 20 73 65 74 20 70 72 65 66 69 78 .+ set prefix
68d0: 4d 61 70 70 69 6e 67 20 5b 3a 3a 74 63 6c 3a 3a Mapping [::tcl::
68e0: 64 69 63 74 3a 3a 63 72 65 61 74 65 5d 0a 2b 20 dict::create].+
68f0: 20 20 20 73 65 74 20 73 75 63 63 65 73 73 6f 72 set successor
6900: 73 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a s [::tcl::dict::
6910: 63 72 65 61 74 65 20 7b 7d 20 7b 7d 5d 0a 20 0a create {} {}]. .
6920: 20 20 20 20 20 23 20 57 61 6c 6b 20 74 68 65 20 # Walk the
6930: 6b 65 79 2d 76 61 6c 75 65 20 70 61 69 72 73 0a key-value pairs.
6940: 20 0a 40 40 20 2d 32 31 34 30 2c 37 20 2b 32 31 .@@ -2140,7 +21
6950: 37 31 2c 37 20 40 40 0d 0a 20 09 20 20 20 20 23 71,7 @@.. . #
6960: 20 64 69 63 74 69 6f 6e 61 72 69 65 73 0a 20 0a dictionaries. .
6970: 20 09 20 20 20 20 64 69 63 74 20 6c 61 70 70 65 . dict lappe
6980: 6e 64 20 70 72 65 66 69 78 4d 61 70 70 69 6e 67 nd prefixMapping
6990: 20 24 70 72 65 66 69 78 20 24 76 61 6c 75 65 0a $prefix $value.
69a0: 2d 09 20 20 20 20 69 66 20 7b 20 21 5b 64 69 63 -. if { ![dic
69b0: 74 20 65 78 69 73 74 73 20 24 73 75 63 63 65 73 t exists $succes
69c0: 73 6f 72 73 20 24 70 72 65 66 69 78 5d 20 7d 20 sors $prefix] }
69d0: 7b 0a 2b 09 20 20 20 20 69 66 20 7b 20 21 5b 3a {.+. if { ![:
69e0: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 73 :tcl::dict::exis
69f0: 74 73 20 24 73 75 63 63 65 73 73 6f 72 73 20 24 ts $successors $
6a00: 70 72 65 66 69 78 5d 20 7d 20 7b 0a 20 09 09 64 prefix] } {. ..d
6a10: 69 63 74 20 73 65 74 20 73 75 63 63 65 73 73 6f ict set successo
6a20: 72 73 20 24 70 72 65 66 69 78 20 7b 7d 0a 20 09 rs $prefix {}. .
6a30: 20 20 20 20 7d 0a 20 09 7d 0a 40 40 20 2d 32 31 }. .}.@@ -21
6a40: 39 37 2c 37 20 2b 32 32 32 38 2c 37 20 40 40 0d 97,7 +2228,7 @@.
6a50: 0a 20 0a 20 20 20 20 20 23 20 47 65 74 20 74 68 . . # Get th
6a60: 65 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61 e characters tha
6a70: 74 20 6d 61 79 20 66 6f 6c 6c 6f 77 20 74 68 65 t may follow the
6a80: 20 63 75 72 72 65 6e 74 20 70 72 65 66 69 78 20 current prefix
6a90: 73 74 72 69 6e 67 0a 20 0a 2d 20 20 20 20 73 65 string. .- se
6aa0: 74 20 73 63 68 61 72 73 20 5b 6c 73 6f 72 74 20 t schars [lsort
6ab0: 2d 61 73 63 69 69 20 5b 64 69 63 74 20 6b 65 79 -ascii [dict key
6ac0: 73 20 5b 64 69 63 74 20 67 65 74 20 24 73 75 63 s [dict get $suc
6ad0: 63 65 73 73 6f 72 73 20 24 70 72 65 66 69 78 53 cessors $prefixS
6ae0: 74 72 69 6e 67 5d 5d 5d 0a 2b 20 20 20 20 73 65 tring]]].+ se
6af0: 74 20 73 63 68 61 72 73 20 5b 6c 73 6f 72 74 20 t schars [lsort
6b00: 2d 61 73 63 69 69 20 5b 3a 3a 74 63 6c 3a 3a 64 -ascii [::tcl::d
6b10: 69 63 74 3a 3a 6b 65 79 73 20 5b 3a 3a 74 63 6c ict::keys [::tcl
6b20: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 73 75 63 ::dict::get $suc
6b30: 63 65 73 73 6f 72 73 20 24 70 72 65 66 69 78 53 cessors $prefixS
6b40: 74 72 69 6e 67 5d 5d 5d 0a 20 20 20 20 20 69 66 tring]]]. if
6b50: 20 7b 20 5b 6c 6c 65 6e 67 74 68 20 24 73 63 68 { [llength $sch
6b60: 61 72 73 5d 20 3d 3d 20 30 20 7d 20 7b 0a 20 09 ars] == 0 } {. .
6b70: 72 65 74 75 72 6e 20 7b 7d 0a 20 20 20 20 20 7d return {}. }
6b80: 0a 40 40 20 2d 32 32 30 37 2c 37 20 2b 32 32 33 .@@ -2207,7 +223
6b90: 38 2c 37 20 40 40 0d 0a 20 20 20 20 20 23 20 70 8,7 @@.. # p
6ba0: 61 72 65 6e 74 68 65 73 65 73 2e 0a 20 0a 20 20 arentheses.. .
6bb0: 20 20 20 73 65 74 20 72 65 20 7b 7d 0a 2d 20 20 set re {}.-
6bc0: 20 20 69 66 20 7b 20 5b 64 69 63 74 20 65 78 69 if { [dict exi
6bd0: 73 74 73 20 24 75 6e 69 71 75 65 50 72 65 66 69 sts $uniquePrefi
6be0: 78 4d 61 70 70 69 6e 67 20 24 70 72 65 66 69 78 xMapping $prefix
6bf0: 53 74 72 69 6e 67 5d 0a 2b 20 20 20 20 69 66 20 String].+ if
6c00: 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a { [::tcl::dict::
6c10: 65 78 69 73 74 73 20 24 75 6e 69 71 75 65 50 72 exists $uniquePr
6c20: 65 66 69 78 4d 61 70 70 69 6e 67 20 24 70 72 65 efixMapping $pre
6c30: 66 69 78 53 74 72 69 6e 67 5d 0a 20 09 20 7c 7c fixString]. . ||
6c40: 20 5b 6c 6c 65 6e 67 74 68 20 24 73 63 68 61 72 [llength $schar
6c50: 73 5d 20 3e 20 31 20 7d 20 7b 0a 20 09 61 70 70 s] > 1 } {. .app
6c60: 65 6e 64 20 72 65 20 22 28 3f 3a 22 0a 20 20 20 end re "(?:".
6c70: 20 20 7d 0a 40 40 20 2d 32 32 32 38 2c 37 20 2b }.@@ -2228,7 +
6c80: 32 32 35 39 2c 37 20 40 40 0d 0a 20 20 20 20 20 2259,7 @@..
6c90: 23 20 6f 70 74 69 6f 6e 61 6c 2e 20 4f 74 68 65 # optional. Othe
6ca0: 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 rwise, if there
6cb0: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 is more than one
6cc0: 20 73 75 63 63 65 73 73 6f 72 20 63 68 61 72 61 successor chara
6cd0: 63 74 65 72 2c 0a 20 20 20 20 20 23 20 63 6c 6f cter,. # clo
6ce0: 73 65 20 74 68 65 20 6e 6f 6e 2d 63 61 70 74 75 se the non-captu
6cf0: 72 69 6e 67 20 70 61 72 65 6e 74 68 65 73 65 73 ring parentheses
6d00: 2e 0a 20 0a 2d 20 20 20 20 69 66 20 7b 20 5b 64 .. .- if { [d
6d10: 69 63 74 20 65 78 69 73 74 73 20 24 75 6e 69 71 ict exists $uniq
6d20: 75 65 50 72 65 66 69 78 4d 61 70 70 69 6e 67 20 uePrefixMapping
6d30: 24 70 72 65 66 69 78 53 74 72 69 6e 67 5d 20 7d $prefixString] }
6d40: 20 7b 0a 2b 20 20 20 20 69 66 20 7b 20 5b 3a 3a {.+ if { [::
6d50: 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 73 74 tcl::dict::exist
6d60: 73 20 24 75 6e 69 71 75 65 50 72 65 66 69 78 4d s $uniquePrefixM
6d70: 61 70 70 69 6e 67 20 24 70 72 65 66 69 78 53 74 apping $prefixSt
6d80: 72 69 6e 67 5d 20 7d 20 7b 0a 20 09 61 70 70 65 ring] } {. .appe
6d90: 6e 64 20 72 65 20 22 29 3f 22 0a 20 20 20 20 20 nd re ")?".
6da0: 7d 20 20 65 6c 73 65 69 66 20 7b 20 5b 6c 6c 65 } elseif { [lle
6db0: 6e 67 74 68 20 24 73 63 68 61 72 73 5d 20 3e 20 ngth $schars] >
6dc0: 31 20 7d 20 7b 0a 20 09 61 70 70 65 6e 64 20 72 1 } {. .append r
6dd0: 65 20 22 29 22 0a 40 40 20 2d 32 32 38 34 2c 31 e ")".@@ -2284,1
6de0: 31 20 2b 32 33 31 35 2c 31 31 20 40 40 0d 0a 20 1 +2315,11 @@..
6df0: 09 73 65 74 20 66 69 65 6c 64 50 6f 73 20 5b 6c .set fieldPos [l
6e00: 69 73 74 5d 0a 20 09 73 65 74 20 6f 6b 20 74 72 ist]. .set ok tr
6e10: 75 65 0a 20 09 66 6f 72 65 61 63 68 20 66 69 65 ue. .foreach fie
6e20: 6c 64 20 24 66 69 65 6c 64 53 65 74 20 7b 0a 2d ld $fieldSet {.-
6e30: 09 20 20 20 20 69 66 20 7b 20 21 20 5b 64 69 63 . if { ! [dic
6e40: 74 20 65 78 69 73 74 73 20 24 64 61 74 65 46 69 t exists $dateFi
6e50: 65 6c 64 73 20 24 66 69 65 6c 64 5d 20 7d 20 7b elds $field] } {
6e60: 0a 2b 09 20 20 20 20 69 66 20 7b 20 21 20 5b 3a .+. if { ! [:
6e70: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 73 :tcl::dict::exis
6e80: 74 73 20 24 64 61 74 65 46 69 65 6c 64 73 20 24 ts $dateFields $
6e90: 66 69 65 6c 64 5d 20 7d 20 7b 0a 20 09 09 73 65 field] } {. ..se
6ea0: 74 20 6f 6b 20 30 0a 20 09 09 62 72 65 61 6b 0a t ok 0. ..break.
6eb0: 20 09 20 20 20 20 7d 0a 2d 09 20 20 20 20 6c 61 . }.-. la
6ec0: 70 70 65 6e 64 20 66 69 65 6c 64 50 6f 73 20 5b ppend fieldPos [
6ed0: 64 69 63 74 20 67 65 74 20 24 64 61 74 65 46 69 dict get $dateFi
6ee0: 65 6c 64 73 20 24 66 69 65 6c 64 5d 0a 2b 09 20 elds $field].+.
6ef0: 20 20 20 6c 61 70 70 65 6e 64 20 66 69 65 6c 64 lappend field
6f00: 50 6f 73 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 Pos [::tcl::dict
6f10: 3a 3a 67 65 74 20 24 64 61 74 65 46 69 65 6c 64 ::get $dateField
6f20: 73 20 24 66 69 65 6c 64 5d 0a 20 09 7d 0a 20 0a s $field]. .}. .
6f30: 20 09 23 20 51 75 69 74 20 69 66 20 77 65 20 64 .# Quit if we d
6f40: 6f 6e 27 74 20 68 61 76 65 20 61 20 63 6f 6d 70 on't have a comp
6f50: 6c 65 74 65 20 73 65 74 20 6f 66 20 66 69 65 6c lete set of fiel
6f60: 64 73 0a 40 40 20 2d 32 33 35 31 2c 37 20 2b 32 ds.@@ -2351,7 +2
6f70: 33 38 32 2c 39 20 40 40 0d 0a 20 23 2d 2d 2d 2d 382,9 @@.. #----
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fc0: 2d 2d 0a 20 0a 20 70 72 6f 63 20 3a 3a 74 63 6c --. . proc ::tcl
6fd0: 3a 3a 63 6c 6f 63 6b 3a 3a 45 6e 74 65 72 4c 6f ::clock::EnterLo
6fe0: 63 61 6c 65 20 7b 20 6c 6f 63 61 6c 65 20 6f 6c cale { locale ol
6ff0: 64 4c 6f 63 61 6c 65 56 61 72 20 7d 20 7b 0a 2d dLocaleVar } {.-
7000: 0a 2b 20 20 20 20 69 66 20 7b 20 24 6c 6f 63 61 .+ if { $loca
7010: 6c 65 20 65 71 20 7b 63 7d 20 7d 20 7b 0a 2b 09 le eq {c} } {.+.
7020: 72 65 74 75 72 6e 0a 2b 20 20 20 20 7d 0a 20 20 return.+ }.
7030: 20 20 20 75 70 76 61 72 20 31 20 24 6f 6c 64 4c upvar 1 $oldL
7040: 6f 63 61 6c 65 56 61 72 20 6f 6c 64 4c 6f 63 61 ocaleVar oldLoca
7050: 6c 65 0a 20 0a 20 20 20 20 20 76 61 72 69 61 62 le. . variab
7060: 6c 65 20 4d 73 67 44 69 72 0a 40 40 20 2d 32 33 le MsgDir.@@ -23
7070: 37 33 2c 37 20 2b 32 34 30 36 2c 37 20 40 40 0d 73,7 +2406,7 @@.
7080: 0a 20 09 20 20 20 20 23 20 64 61 74 65 20 61 6e . . # date an
7090: 64 20 74 69 6d 65 20 66 6f 72 6d 61 74 73 20 66 d time formats f
70a0: 72 6f 6d 20 74 68 65 20 43 6f 6e 74 72 6f 6c 20 rom the Control
70b0: 50 61 6e 65 6c 2e 0a 20 09 20 20 20 20 23 20 46 Panel.. . # F
70c0: 69 72 73 74 2c 20 6c 6f 61 64 20 74 68 65 20 27 irst, load the '
70d0: 63 75 72 72 65 6e 74 27 20 6c 6f 63 61 6c 65 20 current' locale
70e0: 69 66 20 69 74 27 73 20 6e 6f 74 20 79 65 74 20 if it's not yet
70f0: 6c 6f 61 64 65 64 0a 20 0a 2d 09 20 20 20 20 69 loaded. .-. i
7100: 66 20 7b 21 5b 64 69 63 74 20 65 78 69 73 74 73 f {![dict exists
7110: 20 24 4d 63 4c 6f 61 64 65 64 20 24 6f 6c 64 4c $McLoaded $oldL
7120: 6f 63 61 6c 65 5d 20 7d 20 7b 0a 2b 09 20 20 20 ocale] } {.+.
7130: 20 69 66 20 7b 21 5b 3a 3a 74 63 6c 3a 3a 64 69 if {![::tcl::di
7140: 63 74 3a 3a 65 78 69 73 74 73 20 24 4d 63 4c 6f ct::exists $McLo
7150: 61 64 65 64 20 24 6f 6c 64 4c 6f 63 61 6c 65 5d aded $oldLocale]
7160: 20 7d 20 7b 0a 20 09 09 6d 63 6c 6f 61 64 20 24 } {. ..mcload $
7170: 4d 73 67 44 69 72 0a 20 09 09 64 69 63 74 20 73 MsgDir. ..dict s
7180: 65 74 20 4d 63 4c 6f 61 64 65 64 20 24 6f 6c 64 et McLoaded $old
7190: 4c 6f 63 61 6c 65 20 7b 7d 0a 20 09 20 20 20 20 Locale {}. .
71a0: 7d 0a 40 40 20 2d 32 33 38 32 2c 37 20 2b 32 34 }.@@ -2382,7 +24
71b0: 31 35 2c 37 20 40 40 0d 0a 20 09 20 20 20 20 23 15,7 @@.. . #
71c0: 20 67 65 74 20 74 68 65 20 43 6f 6e 74 72 6f 6c get the Control
71d0: 20 50 61 6e 65 6c 20 69 6e 66 6f 72 6d 61 74 69 Panel informati
71e0: 6f 6e 0a 20 0a 20 09 20 20 20 20 73 65 74 20 6c on. . . set l
71f0: 6f 63 61 6c 65 20 24 7b 6f 6c 64 4c 6f 63 61 6c ocale ${oldLocal
7200: 65 7d 5f 77 69 6e 64 6f 77 73 0a 2d 09 20 20 20 e}_windows.-.
7210: 20 69 66 20 7b 20 21 5b 64 69 63 74 20 65 78 69 if { ![dict exi
7220: 73 74 73 20 24 4d 63 4c 6f 61 64 65 64 20 24 6c sts $McLoaded $l
7230: 6f 63 61 6c 65 5d 20 7d 20 7b 0a 2b 09 20 20 20 ocale] } {.+.
7240: 20 69 66 20 7b 20 21 5b 3a 3a 74 63 6c 3a 3a 64 if { ![::tcl::d
7250: 69 63 74 3a 3a 65 78 69 73 74 73 20 24 4d 63 4c ict::exists $McL
7260: 6f 61 64 65 64 20 24 6c 6f 63 61 6c 65 5d 20 7d oaded $locale] }
7270: 20 7b 0a 20 09 09 4c 6f 61 64 57 69 6e 64 6f 77 {. ..LoadWindow
7280: 73 44 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 73 sDateTimeFormats
7290: 20 24 6c 6f 63 61 6c 65 0a 20 09 09 64 69 63 74 $locale. ..dict
72a0: 20 73 65 74 20 4d 63 4c 6f 61 64 65 64 20 24 6c set McLoaded $l
72b0: 6f 63 61 6c 65 20 7b 7d 0a 20 09 20 20 20 20 7d ocale {}. . }
72c0: 0a 40 40 20 2d 32 33 39 36 2c 37 20 2b 32 34 32 .@@ -2396,7 +242
72d0: 39 2c 37 20 40 40 0d 0a 20 20 20 20 20 7d 20 65 9,7 @@.. } e
72e0: 6c 73 65 20 7b 0a 20 09 6d 63 6c 6f 63 61 6c 65 lse {. .mclocale
72f0: 20 24 6c 6f 63 61 6c 65 0a 20 20 20 20 20 7d 0a $locale. }.
7300: 2d 20 20 20 20 69 66 20 7b 20 21 5b 64 69 63 74 - if { ![dict
7310: 20 65 78 69 73 74 73 20 24 4d 63 4c 6f 61 64 65 exists $McLoade
7320: 64 20 24 6c 6f 63 61 6c 65 5d 20 7d 20 7b 0a 2b d $locale] } {.+
7330: 20 20 20 20 69 66 20 7b 20 21 5b 3a 3a 74 63 6c if { ![::tcl
7340: 3a 3a 64 69 63 74 3a 3a 65 78 69 73 74 73 20 24 ::dict::exists $
7350: 4d 63 4c 6f 61 64 65 64 20 24 6c 6f 63 61 6c 65 McLoaded $locale
7360: 5d 20 7d 20 7b 0a 20 09 6d 63 6c 6f 61 64 20 24 ] } {. .mcload $
7370: 4d 73 67 44 69 72 0a 20 09 64 69 63 74 20 73 65 MsgDir. .dict se
7380: 74 20 4d 63 4c 6f 61 64 65 64 20 24 6c 6f 63 61 t McLoaded $loca
7390: 6c 65 20 7b 7d 0a 20 20 20 20 20 7d 0a 40 40 20 le {}. }.@@
73a0: 2d 32 35 35 36 2c 38 20 2b 32 35 38 39 2c 38 20 -2556,8 +2589,8
73b0: 40 40 0d 0a 20 0a 20 20 20 20 20 76 61 72 69 61 @@.. . varia
73c0: 62 6c 65 20 4d 63 4c 6f 61 64 65 64 0a 20 0a 2d ble McLoaded. .-
73d0: 20 20 20 20 69 66 20 7b 20 5b 64 69 63 74 20 65 if { [dict e
73e0: 78 69 73 74 73 20 24 4d 63 4c 6f 61 64 65 64 20 xists $McLoaded
73f0: 24 6c 6f 63 61 6c 65 20 46 4f 52 4d 41 54 20 24 $locale FORMAT $
7400: 66 6f 72 6d 61 74 5d 20 7d 20 7b 0a 2d 09 72 65 format] } {.-.re
7410: 74 75 72 6e 20 5b 64 69 63 74 20 67 65 74 20 24 turn [dict get $
7420: 4d 63 4c 6f 61 64 65 64 20 24 6c 6f 63 61 6c 65 McLoaded $locale
7430: 20 46 4f 52 4d 41 54 20 24 66 6f 72 6d 61 74 5d FORMAT $format]
7440: 0a 2b 20 20 20 20 69 66 20 7b 20 5b 3a 3a 74 63 .+ if { [::tc
7450: 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 73 74 73 20 l::dict::exists
7460: 24 4d 63 4c 6f 61 64 65 64 20 24 6c 6f 63 61 6c $McLoaded $local
7470: 65 20 46 4f 52 4d 41 54 20 24 66 6f 72 6d 61 74 e FORMAT $format
7480: 5d 20 7d 20 7b 0a 2b 09 72 65 74 75 72 6e 20 5b ] } {.+.return [
7490: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 ::tcl::dict::get
74a0: 20 24 4d 63 4c 6f 61 64 65 64 20 24 6c 6f 63 61 $McLoaded $loca
74b0: 6c 65 20 46 4f 52 4d 41 54 20 24 66 6f 72 6d 61 le FORMAT $forma
74c0: 74 5d 0a 20 20 20 20 20 7d 0a 20 20 20 20 20 73 t]. }. s
74d0: 65 74 20 69 6e 46 6f 72 6d 61 74 20 24 66 6f 72 et inFormat $for
74e0: 6d 61 74 0a 20 0a 40 40 20 2d 32 36 35 30 2c 37 mat. .@@ -2650,7
74f0: 20 2b 32 36 38 33 2c 37 20 40 40 0d 0a 20 0a 20 +2683,7 @@.. .
7500: 20 20 20 20 23 20 47 65 74 20 64 61 79 20 6f 66 # Get day of
7510: 20 79 65 61 72 2c 20 7a 65 72 6f 20 62 61 73 65 year, zero base
7520: 64 0a 20 0a 2d 20 20 20 20 73 65 74 20 64 6f 79 d. .- set doy
7530: 20 5b 65 78 70 72 20 7b 20 5b 64 69 63 74 20 67 [expr { [dict g
7540: 65 74 20 24 64 61 74 65 20 64 61 79 4f 66 59 65 et $date dayOfYe
7550: 61 72 5d 20 2d 20 31 20 7d 5d 0a 2b 20 20 20 20 ar] - 1 }].+
7560: 73 65 74 20 64 6f 79 20 5b 65 78 70 72 20 7b 20 set doy [expr {
7570: 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 [::tcl::dict::ge
7580: 74 20 24 64 61 74 65 20 64 61 79 4f 66 59 65 61 t $date dayOfYea
7590: 72 5d 20 2d 20 31 20 7d 5d 0a 20 0a 20 20 20 20 r] - 1 }]. .
75a0: 20 23 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 # Determine whe
75b0: 74 68 65 72 20 74 68 65 20 79 65 61 72 20 69 73 ther the year is
75c0: 20 61 20 6c 65 61 70 20 79 65 61 72 0a 20 0a 40 a leap year. .@
75d0: 40 20 2d 32 36 36 37 2c 39 20 2b 32 37 30 30 2c @ -2667,9 +2700,
75e0: 39 20 40 40 0d 0a 20 20 20 20 20 23 20 50 75 74 9 @@.. # Put
75f0: 20 74 6f 67 65 74 68 65 72 20 74 68 65 20 53 74 together the St
7600: 61 72 44 61 74 65 0a 20 0a 20 20 20 20 20 72 65 arDate. . re
7610: 74 75 72 6e 20 5b 3a 3a 66 6f 72 6d 61 74 20 22 turn [::format "
7620: 53 74 61 72 64 61 74 65 20 25 30 32 64 25 30 33 Stardate %02d%03
7630: 64 2e 25 31 64 22 20 5c 0a 2d 09 09 5b 65 78 70 d.%1d" \.-..[exp
7640: 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64 r { [dict get $d
7650: 61 74 65 20 79 65 61 72 5d 20 2d 20 24 52 6f 64 ate year] - $Rod
7660: 64 65 6e 62 65 72 72 79 20 7d 5d 20 5c 0a 2b 09 denberry }] \.+.
7670: 09 5b 65 78 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a .[expr { [::tcl:
7680: 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 :dict::get $date
7690: 20 79 65 61 72 5d 20 2d 20 24 52 6f 64 64 65 6e year] - $Rodden
76a0: 62 65 72 72 79 20 7d 5d 20 5c 0a 20 09 09 24 66 berry }] \. ..$f
76b0: 72 61 63 74 59 65 61 72 20 5c 0a 2d 09 09 5b 65 ractYear \.-..[e
76c0: 78 70 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 xpr { [dict get
76d0: 24 64 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e $date localSecon
76e0: 64 73 5d 20 25 20 38 36 34 30 30 0a 2b 09 09 5b ds] % 86400.+..[
76f0: 65 78 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 expr { [::tcl::d
7700: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 6c ict::get $date l
7710: 6f 63 61 6c 53 65 63 6f 6e 64 73 5d 20 25 20 38 ocalSeconds] % 8
7720: 36 34 30 30 0a 20 09 09 09 2f 20 28 20 38 36 34 6400. .../ ( 864
7730: 30 30 20 2f 20 31 30 20 29 20 7d 5d 5d 0a 20 7d 00 / 10 ) }]]. }
7740: 0a 20 0a 40 40 20 2d 32 37 30 31 2c 37 20 2b 32 . .@@ -2701,7 +2
7750: 37 33 34 2c 37 20 40 40 0d 0a 20 0a 20 20 20 20 734,7 @@.. .
7760: 20 23 20 42 75 69 6c 64 20 61 20 74 65 6e 74 61 # Build a tenta
7770: 74 69 76 65 20 64 61 74 65 20 66 72 6f 6d 20 79 tive date from y
7780: 65 61 72 20 61 6e 64 20 66 72 61 63 74 69 6f 6e ear and fraction
7790: 2e 0a 20 0a 2d 20 20 20 20 73 65 74 20 64 61 74 .. .- set dat
77a0: 65 20 5b 64 69 63 74 20 63 72 65 61 74 65 20 5c e [dict create \
77b0: 0a 2b 20 20 20 20 73 65 74 20 64 61 74 65 20 5b .+ set date [
77c0: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 63 72 65 ::tcl::dict::cre
77d0: 61 74 65 20 5c 0a 20 09 09 20 20 67 72 65 67 6f ate \. .. grego
77e0: 72 69 61 6e 20 31 20 5c 0a 20 09 09 20 20 65 72 rian 1 \. .. er
77f0: 61 20 43 45 20 5c 0a 20 09 09 20 20 79 65 61 72 a CE \. .. year
7800: 20 5b 65 78 70 72 20 7b 20 24 79 65 61 72 20 2b [expr { $year +
7810: 20 24 52 6f 64 64 65 6e 62 65 72 72 79 20 7d 5d $Roddenberry }]
7820: 20 5c 0a 40 40 20 2d 32 37 32 36 2c 37 20 2b 32 \.@@ -2726,7 +2
7830: 37 35 39 2c 37 20 40 40 0d 0a 20 20 20 20 20 64 759,7 @@.. d
7840: 69 63 74 20 75 6e 73 65 74 20 64 61 74 65 20 67 ict unset date g
7850: 72 65 67 6f 72 69 61 6e 0a 20 20 20 20 20 73 65 regorian. se
7860: 74 20 64 61 74 65 20 5b 47 65 74 4a 75 6c 69 61 t date [GetJulia
7870: 6e 44 61 79 46 72 6f 6d 47 72 65 67 6f 72 69 61 nDayFromGregoria
7880: 6e 45 72 61 59 65 61 72 44 61 79 20 24 64 61 74 nEraYearDay $dat
7890: 65 5b 73 65 74 20 64 61 74 65 20 7b 7d 5d 5d 0a e[set date {}]].
78a0: 20 0a 2d 20 20 20 20 72 65 74 75 72 6e 20 5b 65 .- return [e
78b0: 78 70 72 20 7b 20 38 36 34 30 30 20 2a 20 5b 64 xpr { 86400 * [d
78c0: 69 63 74 20 67 65 74 20 24 64 61 74 65 20 6a 75 ict get $date ju
78d0: 6c 69 61 6e 44 61 79 5d 0a 2b 20 20 20 20 72 65 lianDay].+ re
78e0: 74 75 72 6e 20 5b 65 78 70 72 20 7b 20 38 36 34 turn [expr { 864
78f0: 30 30 20 2a 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 00 * [::tcl::dic
7900: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 6a 75 6c t::get $date jul
7910: 69 61 6e 44 61 79 5d 0a 20 09 09 20 20 20 2d 20 ianDay]. .. -
7920: 32 31 30 38 36 36 38 30 33 32 30 30 0a 20 09 09 210866803200. ..
7930: 20 20 20 2b 20 28 20 38 36 34 30 30 20 2f 20 31 + ( 86400 / 1
7940: 30 20 29 20 2a 20 24 66 72 61 63 74 44 61 79 20 0 ) * $fractDay
7950: 7d 5d 0a 20 0a 40 40 20 2d 32 37 39 34 2c 37 20 }]. .@@ -2794,7
7960: 2b 32 38 32 37 2c 37 20 40 40 0d 0a 20 09 09 09 +2827,7 @@.. ...
7970: 09 09 20 20 20 7b 20 74 77 6f 44 69 67 69 74 46 .. { twoDigitF
7980: 69 65 6c 64 20 79 65 61 72 4f 66 43 65 6e 74 75 ield yearOfCentu
7990: 72 79 20 7d 0a 20 09 09 09 09 09 20 20 20 7b 20 ry }. ..... {
79a0: 66 6f 75 72 44 69 67 69 74 46 69 65 6c 64 20 79 fourDigitField y
79b0: 65 61 72 20 7d 20 7d 20 7b 0a 20 0a 2d 20 20 20 ear } } {. .-
79c0: 20 73 65 74 20 79 72 20 5b 64 69 63 74 20 67 65 set yr [dict ge
79d0: 74 20 24 64 61 74 65 20 24 74 77 6f 44 69 67 69 t $date $twoDigi
79e0: 74 46 69 65 6c 64 5d 0a 2b 20 20 20 20 73 65 74 tField].+ set
79f0: 20 79 72 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 yr [::tcl::dict
7a00: 3a 3a 67 65 74 20 24 64 61 74 65 20 24 74 77 6f ::get $date $two
7a10: 44 69 67 69 74 46 69 65 6c 64 5d 0a 20 20 20 20 DigitField].
7a20: 20 69 66 20 7b 20 24 79 72 20 3c 3d 20 33 37 20 if { $yr <= 37
7a30: 7d 20 7b 0a 20 09 64 69 63 74 20 73 65 74 20 64 } {. .dict set d
7a40: 61 74 65 20 24 66 6f 75 72 44 69 67 69 74 46 69 ate $fourDigitFi
7a50: 65 6c 64 20 5b 65 78 70 72 20 7b 20 24 79 72 20 eld [expr { $yr
7a60: 2b 20 32 30 30 30 20 7d 5d 0a 20 20 20 20 20 7d + 2000 }]. }
7a70: 20 65 6c 73 65 20 7b 0a 40 40 20 2d 32 38 33 37 else {.@@ -2837
7a80: 2c 38 20 2b 32 38 37 30 2c 38 20 40 40 0d 0a 20 ,8 +2870,8 @@..
7a90: 0a 20 20 20 20 20 23 20 53 74 6f 72 65 20 74 68 . # Store th
7aa0: 65 20 63 6f 6e 76 65 72 74 65 64 20 79 65 61 72 e converted year
7ab0: 0a 20 0a 2d 20 20 20 20 64 69 63 74 20 73 65 74 . .- dict set
7ac0: 20 64 61 74 65 20 65 72 61 20 5b 64 69 63 74 20 date era [dict
7ad0: 67 65 74 20 24 64 61 74 65 32 20 65 72 61 5d 0a get $date2 era].
7ae0: 2d 20 20 20 20 64 69 63 74 20 73 65 74 20 64 61 - dict set da
7af0: 74 65 20 79 65 61 72 20 5b 64 69 63 74 20 67 65 te year [dict ge
7b00: 74 20 24 64 61 74 65 32 20 79 65 61 72 5d 0a 2b t $date2 year].+
7b10: 20 20 20 20 64 69 63 74 20 73 65 74 20 64 61 74 dict set dat
7b20: 65 20 65 72 61 20 5b 3a 3a 74 63 6c 3a 3a 64 69 e era [::tcl::di
7b30: 63 74 3a 3a 67 65 74 20 24 64 61 74 65 32 20 65 ct::get $date2 e
7b40: 72 61 5d 0a 2b 20 20 20 20 64 69 63 74 20 73 65 ra].+ dict se
7b50: 74 20 64 61 74 65 20 79 65 61 72 20 5b 3a 3a 74 t date year [::t
7b60: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 cl::dict::get $d
7b70: 61 74 65 32 20 79 65 61 72 5d 0a 20 0a 20 20 20 ate2 year]. .
7b80: 20 20 72 65 74 75 72 6e 20 24 64 61 74 65 0a 20 return $date.
7b90: 0a 40 40 20 2d 32 38 37 38 2c 37 20 2b 32 39 31 .@@ -2878,7 +291
7ba0: 31 2c 37 20 40 40 0d 0a 20 20 20 20 20 23 20 43 1,7 @@.. # C
7bb0: 61 6c 63 75 6c 61 74 65 20 74 68 65 20 49 53 4f alculate the ISO
7bc0: 38 36 30 31 20 64 61 74 65 20 61 6e 64 20 74 72 8601 date and tr
7bd0: 61 6e 73 66 65 72 20 74 68 65 20 79 65 61 72 0a ansfer the year.
7be0: 20 0a 20 20 20 20 20 64 69 63 74 20 73 65 74 20 . dict set
7bf0: 64 61 74 65 20 65 72 61 20 43 45 0a 2d 20 20 20 date era CE.-
7c00: 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20 69 dict set date i
7c10: 73 6f 38 36 30 31 59 65 61 72 20 5b 64 69 63 74 so8601Year [dict
7c20: 20 67 65 74 20 24 64 61 74 65 32 20 69 73 6f 38 get $date2 iso8
7c30: 36 30 31 59 65 61 72 5d 0a 2b 20 20 20 20 64 69 601Year].+ di
7c40: 63 74 20 73 65 74 20 64 61 74 65 20 69 73 6f 38 ct set date iso8
7c50: 36 30 31 59 65 61 72 20 5b 3a 3a 74 63 6c 3a 3a 601Year [::tcl::
7c60: 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 32 dict::get $date2
7c70: 20 69 73 6f 38 36 30 31 59 65 61 72 5d 0a 20 20 iso8601Year].
7c80: 20 20 20 72 65 74 75 72 6e 20 24 64 61 74 65 0a return $date.
7c90: 20 7d 0a 20 0a 40 40 20 2d 32 39 31 31 2c 39 20 }. .@@ -2911,9
7ca0: 2b 32 39 34 34 2c 39 20 40 40 0d 0a 20 20 20 20 +2944,9 @@..
7cb0: 20 23 20 46 69 6e 64 20 74 68 65 20 79 65 61 72 # Find the year
7cc0: 20 61 6e 64 20 6d 6f 6e 74 68 20 63 6f 72 72 65 and month corre
7cd0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 sponding to the
7ce0: 62 61 73 65 20 74 69 6d 65 0a 20 0a 20 20 20 20 base time. .
7cf0: 20 73 65 74 20 64 61 74 65 32 20 5b 47 65 74 44 set date2 [GetD
7d00: 61 74 65 46 69 65 6c 64 73 20 24 62 61 73 65 54 ateFields $baseT
7d10: 69 6d 65 20 24 54 5a 44 61 74 61 28 24 74 69 6d ime $TZData($tim
7d20: 65 7a 6f 6e 65 29 20 24 63 68 61 6e 67 65 6f 76 ezone) $changeov
7d30: 65 72 5d 0a 2d 20 20 20 20 64 69 63 74 20 73 65 er].- dict se
7d40: 74 20 64 61 74 65 20 65 72 61 20 5b 64 69 63 74 t date era [dict
7d50: 20 67 65 74 20 24 64 61 74 65 32 20 65 72 61 5d get $date2 era]
7d60: 0a 2d 20 20 20 20 64 69 63 74 20 73 65 74 20 64 .- dict set d
7d70: 61 74 65 20 79 65 61 72 20 5b 64 69 63 74 20 67 ate year [dict g
7d80: 65 74 20 24 64 61 74 65 32 20 79 65 61 72 5d 0a et $date2 year].
7d90: 2d 20 20 20 20 64 69 63 74 20 73 65 74 20 64 61 - dict set da
7da0: 74 65 20 6d 6f 6e 74 68 20 5b 64 69 63 74 20 67 te month [dict g
7db0: 65 74 20 24 64 61 74 65 32 20 6d 6f 6e 74 68 5d et $date2 month]
7dc0: 0a 2b 20 20 20 20 64 69 63 74 20 73 65 74 20 64 .+ dict set d
7dd0: 61 74 65 20 65 72 61 20 5b 3a 3a 74 63 6c 3a 3a ate era [::tcl::
7de0: 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 32 dict::get $date2
7df0: 20 65 72 61 5d 0a 2b 20 20 20 20 64 69 63 74 20 era].+ dict
7e00: 73 65 74 20 64 61 74 65 20 79 65 61 72 20 5b 3a set date year [:
7e10: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 :tcl::dict::get
7e20: 24 64 61 74 65 32 20 79 65 61 72 5d 0a 2b 20 20 $date2 year].+
7e30: 20 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20 dict set date
7e40: 6d 6f 6e 74 68 20 5b 3a 3a 74 63 6c 3a 3a 64 69 month [::tcl::di
7e50: 63 74 3a 3a 67 65 74 20 24 64 61 74 65 32 20 6d ct::get $date2 m
7e60: 6f 6e 74 68 5d 0a 20 20 20 20 20 72 65 74 75 72 onth]. retur
7e70: 6e 20 24 64 61 74 65 0a 20 0a 20 7d 0a 40 40 20 n $date. . }.@@
7e80: 2d 32 39 35 31 2c 38 20 2b 32 39 38 34 2c 38 20 -2951,8 +2984,8
7e90: 40 40 0d 0a 20 20 20 20 20 23 20 43 61 6c 63 75 @@.. # Calcu
7ea0: 6c 61 74 65 20 74 68 65 20 49 53 4f 38 36 30 31 late the ISO8601
7eb0: 20 64 61 74 65 20 61 6e 64 20 74 72 61 6e 73 66 date and transf
7ec0: 65 72 20 74 68 65 20 79 65 61 72 0a 20 0a 20 20 er the year. .
7ed0: 20 20 20 64 69 63 74 20 73 65 74 20 64 61 74 65 dict set date
7ee0: 20 65 72 61 20 43 45 0a 2d 20 20 20 20 64 69 63 era CE.- dic
7ef0: 74 20 73 65 74 20 64 61 74 65 20 69 73 6f 38 36 t set date iso86
7f00: 30 31 59 65 61 72 20 5b 64 69 63 74 20 67 65 74 01Year [dict get
7f10: 20 24 64 61 74 65 32 20 69 73 6f 38 36 30 31 59 $date2 iso8601Y
7f20: 65 61 72 5d 0a 2d 20 20 20 20 64 69 63 74 20 73 ear].- dict s
7f30: 65 74 20 64 61 74 65 20 69 73 6f 38 36 30 31 57 et date iso8601W
7f40: 65 65 6b 20 5b 64 69 63 74 20 67 65 74 20 24 64 eek [dict get $d
7f50: 61 74 65 32 20 69 73 6f 38 36 30 31 57 65 65 6b ate2 iso8601Week
7f60: 5d 0a 2b 20 20 20 20 64 69 63 74 20 73 65 74 20 ].+ dict set
7f70: 64 61 74 65 20 69 73 6f 38 36 30 31 59 65 61 72 date iso8601Year
7f80: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 [::tcl::dict::g
7f90: 65 74 20 24 64 61 74 65 32 20 69 73 6f 38 36 30 et $date2 iso860
7fa0: 31 59 65 61 72 5d 0a 2b 20 20 20 20 64 69 63 74 1Year].+ dict
7fb0: 20 73 65 74 20 64 61 74 65 20 69 73 6f 38 36 30 set date iso860
7fc0: 31 57 65 65 6b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 1Week [::tcl::di
7fd0: 63 74 3a 3a 67 65 74 20 24 64 61 74 65 32 20 69 ct::get $date2 i
7fe0: 73 6f 38 36 30 31 57 65 65 6b 5d 0a 20 20 20 20 so8601Week].
7ff0: 20 72 65 74 75 72 6e 20 24 64 61 74 65 0a 20 7d return $date. }
8000: 0a 20 0a 40 40 20 2d 32 39 38 34 2c 37 20 2b 33 . .@@ -2984,7 +3
8010: 30 31 37 2c 37 20 40 40 0d 0a 20 20 20 20 20 23 017,7 @@.. #
8020: 20 46 69 6e 64 20 74 68 65 20 4a 75 6c 69 61 6e Find the Julian
8030: 20 44 61 79 20 4e 75 6d 62 65 72 20 63 6f 72 72 Day Number corr
8040: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 esponding to the
8050: 20 62 61 73 65 20 74 69 6d 65 0a 20 0a 20 20 20 base time. .
8060: 20 20 73 65 74 20 64 61 74 65 32 20 5b 47 65 74 set date2 [Get
8070: 44 61 74 65 46 69 65 6c 64 73 20 24 62 61 73 65 DateFields $base
8080: 54 69 6d 65 20 24 54 5a 44 61 74 61 28 24 74 69 Time $TZData($ti
8090: 6d 65 5a 6f 6e 65 29 20 24 63 68 61 6e 67 65 6f meZone) $changeo
80a0: 76 65 72 5d 0a 2d 20 20 20 20 64 69 63 74 20 73 ver].- dict s
80b0: 65 74 20 64 61 74 65 20 6a 75 6c 69 61 6e 44 61 et date julianDa
80c0: 79 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 y [dict get $dat
80d0: 65 32 20 6a 75 6c 69 61 6e 44 61 79 5d 0a 2b 20 e2 julianDay].+
80e0: 20 20 20 64 69 63 74 20 73 65 74 20 64 61 74 65 dict set date
80f0: 20 6a 75 6c 69 61 6e 44 61 79 20 5b 3a 3a 74 63 julianDay [::tc
8100: 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 l::dict::get $da
8110: 74 65 32 20 6a 75 6c 69 61 6e 44 61 79 5d 0a 20 te2 julianDay].
8120: 0a 20 20 20 20 20 72 65 74 75 72 6e 20 24 64 61 . return $da
8130: 74 65 0a 20 7d 0a 40 40 20 2d 33 30 30 39 2c 31 te. }.@@ -3009,1
8140: 31 20 2b 33 30 34 32 2c 31 31 20 40 40 0d 0a 20 1 +3042,11 @@..
8150: 0a 20 70 72 6f 63 20 3a 3a 74 63 6c 3a 3a 63 6c . proc ::tcl::cl
8160: 6f 63 6b 3a 3a 49 6e 74 65 72 70 72 65 74 48 4d ock::InterpretHM
8170: 53 50 20 7b 20 64 61 74 65 20 7d 20 7b 0a 20 0a SP { date } {. .
8180: 2d 20 20 20 20 73 65 74 20 68 72 20 5b 64 69 63 - set hr [dic
8190: 74 20 67 65 74 20 24 64 61 74 65 20 68 6f 75 72 t get $date hour
81a0: 41 4d 50 4d 5d 0a 2b 20 20 20 20 73 65 74 20 68 AMPM].+ set h
81b0: 72 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a r [::tcl::dict::
81c0: 67 65 74 20 24 64 61 74 65 20 68 6f 75 72 41 4d get $date hourAM
81d0: 50 4d 5d 0a 20 20 20 20 20 69 66 20 7b 20 24 68 PM]. if { $h
81e0: 72 20 3d 3d 20 31 32 20 7d 20 7b 0a 20 09 73 65 r == 12 } {. .se
81f0: 74 20 68 72 20 30 0a 20 20 20 20 20 7d 0a 2d 20 t hr 0. }.-
8200: 20 20 20 69 66 20 7b 20 5b 64 69 63 74 20 67 65 if { [dict ge
8210: 74 20 24 64 61 74 65 20 61 6d 50 6d 49 6e 64 69 t $date amPmIndi
8220: 63 61 74 6f 72 5d 20 7d 20 7b 0a 2b 20 20 20 20 cator] } {.+
8230: 69 66 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 if { [::tcl::dic
8240: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 61 6d 50 t::get $date amP
8250: 6d 49 6e 64 69 63 61 74 6f 72 5d 20 7d 20 7b 0a mIndicator] } {.
8260: 20 09 69 6e 63 72 20 68 72 20 31 32 0a 20 20 20 .incr hr 12.
8270: 20 20 7d 0a 20 20 20 20 20 64 69 63 74 20 73 65 }. dict se
8280: 74 20 64 61 74 65 20 68 6f 75 72 20 24 68 72 0a t date hour $hr.
8290: 40 40 20 2d 33 30 34 32 2c 39 20 2b 33 30 37 35 @@ -3042,9 +3075
82a0: 2c 39 20 40 40 0d 0a 20 0a 20 70 72 6f 63 20 3a ,9 @@.. . proc :
82b0: 3a 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 49 6e 74 :tcl::clock::Int
82c0: 65 72 70 72 65 74 48 4d 53 20 7b 20 64 61 74 65 erpretHMS { date
82d0: 20 7d 20 7b 0a 20 0a 2d 20 20 20 20 72 65 74 75 } {. .- retu
82e0: 72 6e 20 5b 65 78 70 72 20 7b 20 28 20 5b 64 69 rn [expr { ( [di
82f0: 63 74 20 67 65 74 20 24 64 61 74 65 20 68 6f 75 ct get $date hou
8300: 72 5d 20 2a 20 36 30 0a 2d 09 09 20 20 20 20 20 r] * 60.-..
8310: 2b 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 + [dict get $dat
8320: 65 20 6d 69 6e 75 74 65 5d 20 29 20 2a 20 36 30 e minute] ) * 60
8330: 0a 2d 09 09 20 20 20 2b 20 5b 64 69 63 74 20 67 .-.. + [dict g
8340: 65 74 20 24 64 61 74 65 20 73 65 63 6f 6e 64 5d et $date second]
8350: 20 7d 5d 0a 2b 20 20 20 20 72 65 74 75 72 6e 20 }].+ return
8360: 5b 65 78 70 72 20 7b 20 28 20 5b 3a 3a 74 63 6c [expr { ( [::tcl
8370: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 ::dict::get $dat
8380: 65 20 68 6f 75 72 5d 20 2a 20 36 30 0a 2b 09 09 e hour] * 60.+..
8390: 20 20 20 20 20 2b 20 5b 3a 3a 74 63 6c 3a 3a 64 + [::tcl::d
83a0: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 6d ict::get $date m
83b0: 69 6e 75 74 65 5d 20 29 20 2a 20 36 30 0a 2b 09 inute] ) * 60.+.
83c0: 09 20 20 20 2b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 . + [::tcl::di
83d0: 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 73 65 ct::get $date se
83e0: 63 6f 6e 64 5d 20 7d 5d 0a 20 0a 20 7d 0a 20 0a cond] }]. . }. .
83f0: 40 40 20 2d 33 30 36 38 2c 38 20 2b 33 31 30 31 @@ -3068,8 +3101
8400: 2c 31 33 20 40 40 0d 0a 20 23 2d 2d 2d 2d 2d 2d ,13 @@.. #------
8410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8450: 0a 20 0a 20 70 72 6f 63 20 3a 3a 74 63 6c 3a 3a . . proc ::tcl::
8460: 63 6c 6f 63 6b 3a 3a 47 65 74 53 79 73 74 65 6d clock::GetSystem
8470: 54 69 6d 65 5a 6f 6e 65 20 7b 7d 20 7b 0a 2d 0a TimeZone {} {.-.
8480: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 43 61 variable Ca
8490: 63 68 65 64 53 79 73 74 65 6d 54 69 6d 65 5a 6f chedSystemTimeZo
84a0: 6e 65 0a 2b 20 20 20 20 69 66 20 7b 20 5b 69 6e ne.+ if { [in
84b0: 66 6f 20 65 78 69 73 74 73 20 43 61 63 68 65 64 fo exists Cached
84c0: 53 79 73 74 65 6d 54 69 6d 65 5a 6f 6e 65 5d 20 SystemTimeZone]
84d0: 7d 20 7b 0a 2b 20 20 20 20 20 20 23 23 20 69 66 } {.+ ## if
84e0: 20 6e 6f 74 20 73 77 69 74 63 68 65 64 20 74 6f not switched to
84f0: 20 61 6e 6f 74 68 65 72 20 74 69 6d 65 20 7a 6f another time zo
8500: 6e 65 20 28 73 69 6d 70 6c 79 20 63 68 65 63 6b ne (simply check
8510: 20 63 61 63 68 65 64 20 65 76 65 72 79 20 31 30 cached every 10
8520: 20 6d 69 6e 75 74 65 73 29 20 3a 0a 2b 20 20 20 minutes) :.+
8530: 20 20 20 69 66 20 7b 61 62 73 28 5b 73 65 63 6f if {abs([seco
8540: 6e 64 73 5d 20 2d 20 5b 6c 69 6e 64 65 78 20 24 nds] - [lindex $
8550: 43 61 63 68 65 64 53 79 73 74 65 6d 54 69 6d 65 CachedSystemTime
8560: 5a 6f 6e 65 20 31 5d 29 20 3c 20 36 30 30 7d 20 Zone 1]) < 600}
8570: 7b 0a 2b 20 20 20 20 20 20 20 20 72 65 74 75 72 {.+ retur
8580: 6e 20 5b 6c 69 6e 64 65 78 20 24 43 61 63 68 65 n [lindex $Cache
8590: 64 53 79 73 74 65 6d 54 69 6d 65 5a 6f 6e 65 20 dSystemTimeZone
85a0: 30 5d 0a 2b 20 20 20 20 20 20 7d 0a 2b 20 20 20 0].+ }.+
85b0: 20 7d 0a 20 20 20 20 20 76 61 72 69 61 62 6c 65 }. variable
85c0: 20 54 69 6d 65 5a 6f 6e 65 42 61 64 0a 20 0a 20 TimeZoneBad. .
85d0: 20 20 20 20 69 66 20 7b 5b 73 65 74 20 72 65 73 if {[set res
85e0: 75 6c 74 20 5b 67 65 74 65 6e 76 20 54 43 4c 5f ult [getenv TCL_
85f0: 54 5a 5d 5d 20 6e 65 20 7b 7d 7d 20 7b 0a 40 40 TZ]] ne {}} {.@@
8600: 20 2d 33 30 38 30 2c 32 38 20 2b 33 31 31 38 2c -3080,28 +3118,
8610: 32 35 20 40 40 0d 0a 20 20 20 20 20 69 66 20 7b 25 @@.. if {
8620: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 74 69 ![info exists ti
8630: 6d 65 7a 6f 6e 65 5d 7d 20 7b 0a 20 20 20 20 20 mezone]} {.
8640: 20 20 20 20 23 20 43 61 63 68 65 20 74 68 65 20 # Cache the
8650: 74 69 6d 65 20 7a 6f 6e 65 20 6f 6e 6c 79 20 69 time zone only i
8660: 66 20 69 74 20 77 61 73 20 64 65 74 65 63 74 65 f it was detecte
8670: 64 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 0a d by one of the.
8680: 20 20 20 20 20 20 20 20 20 23 20 65 78 70 65 6e # expen
8690: 73 69 76 65 20 6d 65 74 68 6f 64 73 2e 0a 2d 20 sive methods..-
86a0: 20 20 20 20 20 20 20 69 66 20 7b 20 5b 69 6e 66 if { [inf
86b0: 6f 20 65 78 69 73 74 73 20 43 61 63 68 65 64 53 o exists CachedS
86c0: 79 73 74 65 6d 54 69 6d 65 5a 6f 6e 65 5d 20 7d ystemTimeZone] }
86d0: 20 7b 0a 2d 20 20 20 20 20 20 20 20 20 20 20 20 {.-
86e0: 73 65 74 20 74 69 6d 65 7a 6f 6e 65 20 24 43 61 set timezone $Ca
86f0: 63 68 65 64 53 79 73 74 65 6d 54 69 6d 65 5a 6f chedSystemTimeZo
8700: 6e 65 0a 2d 20 20 20 20 20 20 20 20 7d 20 65 6c ne.- } el
8710: 73 65 69 66 20 7b 20 24 3a 3a 74 63 6c 5f 70 6c seif { $::tcl_pl
8720: 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 atform(platform)
8730: 20 65 71 20 7b 77 69 6e 64 6f 77 73 7d 20 7d 20 eq {windows} }
8740: 7b 0a 2d 20 20 20 20 20 20 20 20 20 20 20 20 73 {.- s
8750: 65 74 20 74 69 6d 65 7a 6f 6e 65 20 5b 47 75 65 et timezone [Gue
8760: 73 73 57 69 6e 64 6f 77 73 54 69 6d 65 5a 6f 6e ssWindowsTimeZon
8770: 65 5d 0a 2d 20 20 20 20 20 20 20 20 7d 20 65 6c e].- } el
8780: 73 65 69 66 20 7b 20 5b 66 69 6c 65 20 65 78 69 seif { [file exi
8790: 73 74 73 20 2f 65 74 63 2f 6c 6f 63 61 6c 74 69 sts /etc/localti
87a0: 6d 65 5d 0a 2d 20 20 20 20 20 20 20 20 20 20 20 me].-
87b0: 20 20 20 20 20 20 20 20 26 26 20 21 5b 63 61 74 && ![cat
87c0: 63 68 20 7b 52 65 61 64 5a 6f 6e 65 69 6e 66 6f ch {ReadZoneinfo
87d0: 46 69 6c 65 20 5c 0a 2d 20 20 20 20 20 20 20 20 File \.-
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
87f0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 2f 4c Tcl/L
8800: 6f 63 61 6c 74 69 6d 65 20 2f 65 74 63 2f 6c 6f ocaltime /etc/lo
8810: 63 61 6c 74 69 6d 65 7d 5d 20 7d 20 7b 0a 2d 20 caltime}] } {.-
8820: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74 set t
8830: 69 6d 65 7a 6f 6e 65 20 3a 54 63 6c 2f 4c 6f 63 imezone :Tcl/Loc
8840: 61 6c 74 69 6d 65 0a 2d 20 20 20 20 20 20 20 20 altime.-
8850: 7d 20 65 6c 73 65 20 7b 0a 2d 20 20 20 20 20 20 } else {.-
8860: 20 20 20 20 20 20 73 65 74 20 74 69 6d 65 7a 6f set timezo
8870: 6e 65 20 3a 6c 6f 63 61 6c 74 69 6d 65 0a 2d 20 ne :localtime.-
8880: 20 20 20 20 20 20 20 7d 0a 2d 09 73 65 74 20 43 }.-.set C
8890: 61 63 68 65 64 53 79 73 74 65 6d 54 69 6d 65 5a achedSystemTimeZ
88a0: 6f 6e 65 20 24 74 69 6d 65 7a 6f 6e 65 0a 2b 09 one $timezone.+.
88b0: 69 66 20 7b 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 if { $::tcl_plat
88c0: 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 20 65 form(platform) e
88d0: 71 20 7b 77 69 6e 64 6f 77 73 7d 20 7d 20 7b 0a q {windows} } {.
88e0: 2b 09 20 20 20 20 73 65 74 20 74 69 6d 65 7a 6f +. set timezo
88f0: 6e 65 20 5b 47 75 65 73 73 57 69 6e 64 6f 77 73 ne [GuessWindows
8900: 54 69 6d 65 5a 6f 6e 65 5d 0a 2b 09 7d 20 65 6c TimeZone].+.} el
8910: 73 65 69 66 20 7b 20 5b 66 69 6c 65 20 65 78 69 seif { [file exi
8920: 73 74 73 20 2f 65 74 63 2f 6c 6f 63 61 6c 74 69 sts /etc/localti
8930: 6d 65 5d 0a 2b 09 20 20 20 20 20 20 20 26 26 20 me].+. &&
8940: 21 5b 63 61 74 63 68 20 7b 52 65 61 64 5a 6f 6e ![catch {ReadZon
8950: 65 69 6e 66 6f 46 69 6c 65 20 5c 0a 2b 09 09 20 einfoFile \.+..
8960: 20 20 20 20 20 20 54 63 6c 2f 4c 6f 63 61 6c 74 Tcl/Localt
8970: 69 6d 65 20 2f 65 74 63 2f 6c 6f 63 61 6c 74 69 ime /etc/localti
8980: 6d 65 7d 5d 20 7d 20 7b 0a 2b 09 20 20 20 20 73 me}] } {.+. s
8990: 65 74 20 74 69 6d 65 7a 6f 6e 65 20 3a 54 63 6c et timezone :Tcl
89a0: 2f 4c 6f 63 61 6c 74 69 6d 65 0a 2b 09 7d 20 65 /Localtime.+.} e
89b0: 6c 73 65 20 7b 0a 2b 09 20 20 20 20 73 65 74 20 lse {.+. set
89c0: 74 69 6d 65 7a 6f 6e 65 20 3a 6c 6f 63 61 6c 74 timezone :localt
89d0: 69 6d 65 0a 2b 09 7d 0a 20 20 20 20 20 7d 0a 2d ime.+.}. }.-
89e0: 20 20 20 20 69 66 20 7b 20 21 5b 64 69 63 74 20 if { ![dict
89f0: 65 78 69 73 74 73 20 24 54 69 6d 65 5a 6f 6e 65 exists $TimeZone
8a00: 42 61 64 20 24 74 69 6d 65 7a 6f 6e 65 5d 20 7d Bad $timezone] }
8a10: 20 7b 0a 2b 20 20 20 20 69 66 20 7b 20 21 5b 3a {.+ if { ![:
8a20: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 73 :tcl::dict::exis
8a30: 74 73 20 24 54 69 6d 65 5a 6f 6e 65 42 61 64 20 ts $TimeZoneBad
8a40: 24 74 69 6d 65 7a 6f 6e 65 5d 20 7d 20 7b 0a 20 $timezone] } {.
8a50: 09 64 69 63 74 20 73 65 74 20 54 69 6d 65 5a 6f .dict set TimeZo
8a60: 6e 65 42 61 64 20 24 74 69 6d 65 7a 6f 6e 65 20 neBad $timezone
8a70: 5b 63 61 74 63 68 20 7b 53 65 74 75 70 54 69 6d [catch {SetupTim
8a80: 65 5a 6f 6e 65 20 24 74 69 6d 65 7a 6f 6e 65 7d eZone $timezone}
8a90: 5d 0a 20 20 20 20 20 7d 0a 2d 20 20 20 20 69 66 ]. }.- if
8aa0: 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 54 69 { [dict get $Ti
8ab0: 6d 65 5a 6f 6e 65 42 61 64 20 24 74 69 6d 65 7a meZoneBad $timez
8ac0: 6f 6e 65 5d 20 7d 20 7b 0a 2d 09 72 65 74 75 72 one] } {.-.retur
8ad0: 6e 20 3a 6c 6f 63 61 6c 74 69 6d 65 0a 2d 20 20 n :localtime.-
8ae0: 20 20 7d 20 65 6c 73 65 20 7b 0a 2d 09 72 65 74 } else {.-.ret
8af0: 75 72 6e 20 24 74 69 6d 65 7a 6f 6e 65 0a 2b 20 urn $timezone.+
8b00: 20 20 20 69 66 20 7b 20 5b 3a 3a 74 63 6c 3a 3a if { [::tcl::
8b10: 64 69 63 74 3a 3a 67 65 74 20 24 54 69 6d 65 5a dict::get $TimeZ
8b20: 6f 6e 65 42 61 64 20 24 74 69 6d 65 7a 6f 6e 65 oneBad $timezone
8b30: 5d 20 7d 20 7b 0a 2b 09 73 65 74 20 74 69 6d 65 ] } {.+.set time
8b40: 7a 6f 6e 65 20 3a 6c 6f 63 61 6c 74 69 6d 65 0a zone :localtime.
8b50: 20 20 20 20 20 7d 0a 2d 0a 2b 20 20 20 20 23 23 }.-.+ ##
8b60: 20 63 61 63 68 65 20 28 73 69 6d 70 6c 79 20 63 cache (simply c
8b70: 68 65 63 6b 20 63 61 63 68 65 64 20 65 76 65 72 heck cached ever
8b80: 79 20 31 30 20 6d 69 6e 75 74 65 73 20 28 72 6f y 10 minutes (ro
8b90: 75 6e 64 65 64 20 74 6f 20 30 30 3a 31 30 3a 30 unded to 00:10:0
8ba0: 30 29 29 3a 0a 2b 20 20 20 20 73 65 74 20 43 61 0)):.+ set Ca
8bb0: 63 68 65 64 53 79 73 74 65 6d 54 69 6d 65 5a 6f chedSystemTimeZo
8bc0: 6e 65 20 5b 6c 69 73 74 20 24 74 69 6d 65 7a 6f ne [list $timezo
8bd0: 6e 65 20 5b 65 78 70 72 20 7b 5b 73 65 74 20 73 ne [expr {[set s
8be0: 77 69 74 63 68 74 69 6d 65 20 5b 73 65 63 6f 6e witchtime [secon
8bf0: 64 73 5d 5d 20 2d 20 28 24 73 77 69 74 63 68 74 ds]] - ($switcht
8c00: 69 6d 65 20 25 20 36 30 30 29 7d 5d 5d 0a 2b 20 ime % 600)}]].+
8c10: 20 20 20 72 65 74 75 72 6e 20 24 74 69 6d 65 7a return $timez
8c20: 6f 6e 65 0a 20 7d 0a 20 0a 20 23 2d 2d 2d 2d 2d one. }. . #-----
8c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c70: 2d 0a 40 40 20 2d 33 31 33 32 2c 31 31 20 2b 33 -.@@ -3132,11 +3
8c80: 31 36 37 2c 31 31 20 40 40 0d 0a 20 20 20 20 20 167,11 @@..
8c90: 76 61 72 69 61 62 6c 65 20 4c 65 67 61 63 79 54 variable LegacyT
8ca0: 69 6d 65 5a 6f 6e 65 0a 20 0a 20 20 20 20 20 73 imeZone. . s
8cb0: 65 74 20 74 7a 6e 61 6d 65 20 5b 73 74 72 69 6e et tzname [strin
8cc0: 67 20 74 6f 6c 6f 77 65 72 20 24 74 7a 6e 61 6d g tolower $tznam
8cd0: 65 5d 0a 2d 20 20 20 20 69 66 20 7b 20 21 5b 64 e].- if { ![d
8ce0: 69 63 74 20 65 78 69 73 74 73 20 24 4c 65 67 61 ict exists $Lega
8cf0: 63 79 54 69 6d 65 5a 6f 6e 65 20 24 74 7a 6e 61 cyTimeZone $tzna
8d00: 6d 65 5d 20 7d 20 7b 0a 2b 20 20 20 20 69 66 20 me] } {.+ if
8d10: 7b 20 21 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a { ![::tcl::dict:
8d20: 3a 65 78 69 73 74 73 20 24 4c 65 67 61 63 79 54 :exists $LegacyT
8d30: 69 6d 65 5a 6f 6e 65 20 24 74 7a 6e 61 6d 65 5d imeZone $tzname]
8d40: 20 7d 20 7b 0a 20 09 72 65 74 75 72 6e 20 2d 63 } {. .return -c
8d50: 6f 64 65 20 65 72 72 6f 72 20 2d 65 72 72 6f 72 ode error -error
8d60: 63 6f 64 65 20 5b 6c 69 73 74 20 43 4c 4f 43 4b code [list CLOCK
8d70: 20 62 61 64 54 5a 4e 61 6d 65 20 24 74 7a 6e 61 badTZName $tzna
8d80: 6d 65 5d 20 5c 0a 20 09 20 20 20 20 22 74 69 6d me] \. . "tim
8d90: 65 20 7a 6f 6e 65 20 5c 22 24 74 7a 6e 61 6d 65 e zone \"$tzname
8da0: 5c 22 20 6e 6f 74 20 66 6f 75 6e 64 22 0a 20 20 \" not found".
8db0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 2d 09 72 65 } else {.-.re
8dc0: 74 75 72 6e 20 5b 64 69 63 74 20 67 65 74 20 24 turn [dict get $
8dd0: 4c 65 67 61 63 79 54 69 6d 65 5a 6f 6e 65 20 24 LegacyTimeZone $
8de0: 74 7a 6e 61 6d 65 5d 0a 2b 09 72 65 74 75 72 6e tzname].+.return
8df0: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 [::tcl::dict::g
8e00: 65 74 20 24 4c 65 67 61 63 79 54 69 6d 65 5a 6f et $LegacyTimeZo
8e10: 6e 65 20 24 74 7a 6e 61 6d 65 5d 0a 20 20 20 20 ne $tzname].
8e20: 20 7d 0a 20 0a 20 7d 0a 40 40 20 2d 33 32 31 32 }. . }.@@ -3212
8e30: 2c 37 20 2b 33 32 34 37 2c 37 20 40 40 0d 0a 20 ,7 +3247,7 @@..
8e40: 09 20 20 20 20 23 20 54 68 69 73 20 6c 6f 6f 6b . # This look
8e50: 73 20 6c 69 6b 65 20 61 20 50 4f 53 49 58 20 74 s like a POSIX t
8e60: 69 6d 65 20 7a 6f 6e 65 20 2d 20 74 72 79 20 74 ime zone - try t
8e70: 6f 20 70 72 6f 63 65 73 73 20 69 74 0a 20 0a 20 o process it. .
8e80: 09 20 20 20 20 69 66 20 7b 20 5b 63 61 74 63 68 . if { [catch
8e90: 20 7b 50 72 6f 63 65 73 73 50 6f 73 69 78 54 69 {ProcessPosixTi
8ea0: 6d 65 5a 6f 6e 65 20 24 74 7a 66 69 65 6c 64 73 meZone $tzfields
8eb0: 7d 20 64 61 74 61 20 6f 70 74 73 5d 20 7d 20 7b } data opts] } {
8ec0: 0a 2d 09 09 69 66 20 7b 20 5b 6c 69 6e 64 65 78 .-..if { [lindex
8ed0: 20 5b 64 69 63 74 20 67 65 74 20 24 6f 70 74 73 [dict get $opts
8ee0: 20 2d 65 72 72 6f 72 63 6f 64 65 5d 20 30 5d 20 -errorcode] 0]
8ef0: 65 71 20 7b 43 4c 4f 43 4b 7d 20 7d 20 7b 0a 2b eq {CLOCK} } {.+
8f00: 09 09 69 66 20 7b 20 5b 6c 69 6e 64 65 78 20 5b ..if { [lindex [
8f10: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 ::tcl::dict::get
8f20: 20 24 6f 70 74 73 20 2d 65 72 72 6f 72 63 6f 64 $opts -errorcod
8f30: 65 5d 20 30 5d 20 65 71 20 7b 43 4c 4f 43 4b 7d e] 0] eq {CLOCK}
8f40: 20 7d 20 7b 0a 20 09 09 20 20 20 20 64 69 63 74 } {. .. dict
8f50: 20 75 6e 73 65 74 20 6f 70 74 73 20 2d 65 72 72 unset opts -err
8f60: 6f 72 69 6e 66 6f 0a 20 09 09 7d 0a 20 09 09 72 orinfo. ..}. ..r
8f70: 65 74 75 72 6e 20 2d 6f 70 74 69 6f 6e 73 20 24 eturn -options $
8f80: 6f 70 74 73 20 24 64 61 74 61 0a 40 40 20 2d 33 opts $data.@@ -3
8f90: 33 30 37 2c 31 35 20 2b 33 33 34 32 2c 31 35 20 307,15 +3342,15
8fa0: 40 40 0d 0a 20 20 20 20 20 23 20 69 6e 20 61 6e @@.. # in an
8fb0: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 28 65 2e environment (e.
8fc0: 67 2e 20 73 74 61 72 70 61 63 6b 29 20 77 68 65 g. starpack) whe
8fd0: 72 65 20 74 7a 64 61 74 61 20 69 73 20 69 6e 63 re tzdata is inc
8fe0: 6f 6d 70 6c 65 74 65 2e 0a 20 20 20 20 20 23 20 omplete.. #
8ff0: 28 42 75 67 20 31 32 33 37 39 30 37 29 0a 20 0a (Bug 1237907). .
9000: 2d 20 20 20 20 69 66 20 7b 20 5b 64 69 63 74 20 - if { [dict
9010: 65 78 69 73 74 73 20 24 57 69 6e 5a 6f 6e 65 49 exists $WinZoneI
9020: 6e 66 6f 20 24 64 61 74 61 5d 20 7d 20 7b 0a 2d nfo $data] } {.-
9030: 09 73 65 74 20 74 7a 6e 61 6d 65 20 5b 64 69 63 .set tzname [dic
9040: 74 20 67 65 74 20 24 57 69 6e 5a 6f 6e 65 49 6e t get $WinZoneIn
9050: 66 6f 20 24 64 61 74 61 5d 0a 2d 09 69 66 20 7b fo $data].-.if {
9060: 20 21 20 5b 64 69 63 74 20 65 78 69 73 74 73 20 ! [dict exists
9070: 24 54 69 6d 65 5a 6f 6e 65 42 61 64 20 24 74 7a $TimeZoneBad $tz
9080: 6e 61 6d 65 5d 20 7d 20 7b 0a 2b 20 20 20 20 69 name] } {.+ i
9090: 66 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 f { [::tcl::dict
90a0: 3a 3a 65 78 69 73 74 73 20 24 57 69 6e 5a 6f 6e ::exists $WinZon
90b0: 65 49 6e 66 6f 20 24 64 61 74 61 5d 20 7d 20 7b eInfo $data] } {
90c0: 0a 2b 09 73 65 74 20 74 7a 6e 61 6d 65 20 5b 3a .+.set tzname [:
90d0: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 :tcl::dict::get
90e0: 24 57 69 6e 5a 6f 6e 65 49 6e 66 6f 20 24 64 61 $WinZoneInfo $da
90f0: 74 61 5d 0a 2b 09 69 66 20 7b 20 21 20 5b 3a 3a ta].+.if { ! [::
9100: 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 73 74 tcl::dict::exist
9110: 73 20 24 54 69 6d 65 5a 6f 6e 65 42 61 64 20 24 s $TimeZoneBad $
9120: 74 7a 6e 61 6d 65 5d 20 7d 20 7b 0a 20 09 20 20 tzname] } {. .
9130: 20 20 64 69 63 74 20 73 65 74 20 54 69 6d 65 5a dict set TimeZ
9140: 6f 6e 65 42 61 64 20 24 74 7a 6e 61 6d 65 20 5b oneBad $tzname [
9150: 63 61 74 63 68 20 7b 53 65 74 75 70 54 69 6d 65 catch {SetupTime
9160: 5a 6f 6e 65 20 24 74 7a 6e 61 6d 65 7d 5d 0a 20 Zone $tzname}].
9170: 09 7d 0a 20 20 20 20 20 7d 20 65 6c 73 65 20 7b .}. } else {
9180: 0a 20 09 73 65 74 20 74 7a 6e 61 6d 65 20 7b 7d . .set tzname {}
9190: 0a 20 20 20 20 20 7d 0a 2d 20 20 20 20 69 66 20 . }.- if
91a0: 7b 20 24 74 7a 6e 61 6d 65 20 65 71 20 7b 7d 20 { $tzname eq {}
91b0: 7c 7c 20 5b 64 69 63 74 20 67 65 74 20 24 54 69 || [dict get $Ti
91c0: 6d 65 5a 6f 6e 65 42 61 64 20 24 74 7a 6e 61 6d meZoneBad $tznam
91d0: 65 5d 20 7d 20 7b 0a 2b 20 20 20 20 69 66 20 7b e] } {.+ if {
91e0: 20 24 74 7a 6e 61 6d 65 20 65 71 20 7b 7d 20 7c $tzname eq {} |
91f0: 7c 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a | [::tcl::dict::
9200: 67 65 74 20 24 54 69 6d 65 5a 6f 6e 65 42 61 64 get $TimeZoneBad
9210: 20 24 74 7a 6e 61 6d 65 5d 20 7d 20 7b 0a 20 09 $tzname] } {. .
9220: 6c 61 73 73 69 67 6e 20 24 64 61 74 61 20 5c 0a lassign $data \.
9230: 20 09 20 20 20 20 62 69 61 73 20 73 74 64 42 69 . bias stdBi
9240: 61 73 20 64 73 74 42 69 61 73 20 5c 0a 20 09 20 as dstBias \. .
9250: 20 20 20 73 74 64 59 65 61 72 20 73 74 64 4d 6f stdYear stdMo
9260: 6e 74 68 20 73 74 64 44 61 79 4f 66 57 65 65 6b nth stdDayOfWeek
9270: 20 73 74 64 44 61 79 4f 66 4d 6f 6e 74 68 20 5c stdDayOfMonth \
9280: 0a 40 40 20 2d 33 33 38 30 2c 37 20 2b 33 34 31 .@@ -3380,7 +341
9290: 35 2c 37 20 40 40 0d 0a 20 09 64 69 63 74 20 73 5,7 @@.. .dict s
92a0: 65 74 20 57 69 6e 5a 6f 6e 65 49 6e 66 6f 20 24 et WinZoneInfo $
92b0: 64 61 74 61 20 24 74 7a 6e 61 6d 65 0a 20 20 20 data $tzname.
92c0: 20 20 7d 20 0a 20 0a 2d 20 20 20 20 72 65 74 75 } . .- retu
92d0: 72 6e 20 5b 64 69 63 74 20 67 65 74 20 24 57 69 rn [dict get $Wi
92e0: 6e 5a 6f 6e 65 49 6e 66 6f 20 24 64 61 74 61 5d nZoneInfo $data]
92f0: 0a 2b 20 20 20 20 72 65 74 75 72 6e 20 5b 3a 3a .+ return [::
9300: 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 tcl::dict::get $
9310: 57 69 6e 5a 6f 6e 65 49 6e 66 6f 20 24 64 61 74 WinZoneInfo $dat
9320: 61 5d 0a 20 0a 20 7d 0a 20 0a 40 40 20 2d 33 35 a]. . }. .@@ -35
9330: 39 39 2c 37 20 2b 33 36 33 34 2c 37 20 40 40 0d 99,7 +3634,7 @@.
9340: 0a 20 09 7d 0a 20 09 73 65 74 20 6c 61 73 74 54 . .}. .set lastT
9350: 69 6d 65 20 24 74 0a 20 09 6c 61 73 73 69 67 6e ime $t. .lassign
9360: 20 5b 6c 69 6e 64 65 78 20 24 74 79 70 65 73 20 [lindex $types
9370: 24 63 5d 20 67 6d 74 6f 66 66 20 69 73 44 73 74 $c] gmtoff isDst
9380: 20 61 62 62 72 49 6e 64 0a 2d 09 73 65 74 20 61 abbrInd.-.set a
9390: 62 62 72 65 76 20 5b 64 69 63 74 20 67 65 74 20 bbrev [dict get
93a0: 24 61 62 62 72 65 76 73 20 24 61 62 62 72 49 6e $abbrevs $abbrIn
93b0: 64 5d 0a 2b 09 73 65 74 20 61 62 62 72 65 76 20 d].+.set abbrev
93c0: 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 [::tcl::dict::ge
93d0: 74 20 24 61 62 62 72 65 76 73 20 24 61 62 62 72 t $abbrevs $abbr
93e0: 49 6e 64 5d 0a 20 09 6c 61 70 70 65 6e 64 20 72 Ind]. .lappend r
93f0: 20 5b 6c 69 73 74 20 24 74 20 24 67 6d 74 6f 66 [list $t $gmtof
9400: 66 20 24 69 73 44 73 74 20 24 61 62 62 72 65 76 f $isDst $abbrev
9410: 5d 0a 20 20 20 20 20 7d 0a 20 0a 40 40 20 2d 33 ]. }. .@@ -3
9420: 38 33 34 2c 32 33 20 2b 33 38 36 39 2c 32 33 20 834,23 +3869,23
9430: 40 40 0d 0a 20 0a 20 20 20 20 20 23 20 44 65 74 @@.. . # Det
9440: 65 72 6d 69 6e 65 20 74 68 65 20 73 74 61 6e 64 ermine the stand
9450: 61 72 64 20 74 69 6d 65 20 7a 6f 6e 65 20 6e 61 ard time zone na
9460: 6d 65 20 61 6e 64 20 73 65 63 6f 6e 64 73 20 65 me and seconds e
9470: 61 73 74 20 6f 66 20 47 72 65 65 6e 77 69 63 68 ast of Greenwich
9480: 0a 20 0a 2d 20 20 20 20 73 65 74 20 73 74 64 4e . .- set stdN
9490: 61 6d 65 20 5b 64 69 63 74 20 67 65 74 20 24 7a ame [dict get $z
94a0: 20 73 74 64 4e 61 6d 65 5d 0a 2b 20 20 20 20 73 stdName].+ s
94b0: 65 74 20 73 74 64 4e 61 6d 65 20 5b 3a 3a 74 63 et stdName [::tc
94c0: 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 7a 20 l::dict::get $z
94d0: 73 74 64 4e 61 6d 65 5d 0a 20 20 20 20 20 69 66 stdName]. if
94e0: 20 7b 20 5b 73 74 72 69 6e 67 20 69 6e 64 65 78 { [string index
94f0: 20 24 73 74 64 4e 61 6d 65 20 30 5d 20 65 71 20 $stdName 0] eq
9500: 7b 3c 7d 20 7d 20 7b 0a 20 09 73 65 74 20 73 74 {<} } {. .set st
9510: 64 4e 61 6d 65 20 5b 73 74 72 69 6e 67 20 72 61 dName [string ra
9520: 6e 67 65 20 24 73 74 64 4e 61 6d 65 20 31 20 65 nge $stdName 1 e
9530: 6e 64 2d 31 5d 0a 20 20 20 20 20 7d 0a 2d 20 20 nd-1]. }.-
9540: 20 20 69 66 20 7b 20 5b 64 69 63 74 20 67 65 74 if { [dict get
9550: 20 24 7a 20 73 74 64 53 69 67 6e 75 6d 5d 20 65 $z stdSignum] e
9560: 71 20 7b 2d 7d 20 7d 20 7b 0a 2b 20 20 20 20 69 q {-} } {.+ i
9570: 66 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 f { [::tcl::dict
9580: 3a 3a 67 65 74 20 24 7a 20 73 74 64 53 69 67 6e ::get $z stdSign
9590: 75 6d 5d 20 65 71 20 7b 2d 7d 20 7d 20 7b 0a 20 um] eq {-} } {.
95a0: 09 73 65 74 20 73 74 64 53 69 67 6e 75 6d 20 2b .set stdSignum +
95b0: 31 0a 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 1. } else {.
95c0: 20 09 73 65 74 20 73 74 64 53 69 67 6e 75 6d 20 .set stdSignum
95d0: 2d 31 0a 20 20 20 20 20 7d 0a 2d 20 20 20 20 73 -1. }.- s
95e0: 65 74 20 73 74 64 48 6f 75 72 73 20 5b 6c 69 6e et stdHours [lin
95f0: 64 65 78 20 5b 3a 3a 73 63 61 6e 20 5b 64 69 63 dex [::scan [dic
9600: 74 20 67 65 74 20 24 7a 20 73 74 64 48 6f 75 72 t get $z stdHour
9610: 73 5d 20 25 64 5d 20 30 5d 20 0a 2d 20 20 20 20 s] %d] 0] .-
9620: 69 66 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 if { [dict get $
9630: 7a 20 73 74 64 4d 69 6e 75 74 65 73 5d 20 6e 65 z stdMinutes] ne
9640: 20 7b 7d 20 7d 20 7b 0a 2d 09 73 65 74 20 73 74 {} } {.-.set st
9650: 64 4d 69 6e 75 74 65 73 20 5b 6c 69 6e 64 65 78 dMinutes [lindex
9660: 20 5b 3a 3a 73 63 61 6e 20 5b 64 69 63 74 20 67 [::scan [dict g
9670: 65 74 20 24 7a 20 73 74 64 4d 69 6e 75 74 65 73 et $z stdMinutes
9680: 5d 20 25 64 5d 20 30 5d 20 0a 2b 20 20 20 20 73 ] %d] 0] .+ s
9690: 65 74 20 73 74 64 48 6f 75 72 73 20 5b 6c 69 6e et stdHours [lin
96a0: 64 65 78 20 5b 3a 3a 73 63 61 6e 20 5b 3a 3a 74 dex [::scan [::t
96b0: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 7a cl::dict::get $z
96c0: 20 73 74 64 48 6f 75 72 73 5d 20 25 64 5d 20 30 stdHours] %d] 0
96d0: 5d 20 0a 2b 20 20 20 20 69 66 20 7b 20 5b 3a 3a ] .+ if { [::
96e0: 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 tcl::dict::get $
96f0: 7a 20 73 74 64 4d 69 6e 75 74 65 73 5d 20 6e 65 z stdMinutes] ne
9700: 20 7b 7d 20 7d 20 7b 0a 2b 09 73 65 74 20 73 74 {} } {.+.set st
9710: 64 4d 69 6e 75 74 65 73 20 5b 6c 69 6e 64 65 78 dMinutes [lindex
9720: 20 5b 3a 3a 73 63 61 6e 20 5b 3a 3a 74 63 6c 3a [::scan [::tcl:
9730: 3a 64 69 63 74 3a 3a 67 65 74 20 24 7a 20 73 74 :dict::get $z st
9740: 64 4d 69 6e 75 74 65 73 5d 20 25 64 5d 20 30 5d dMinutes] %d] 0]
9750: 20 0a 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a . } else {.
9760: 20 09 73 65 74 20 73 74 64 4d 69 6e 75 74 65 73 .set stdMinutes
9770: 20 30 0a 20 20 20 20 20 7d 0a 2d 20 20 20 20 69 0. }.- i
9780: 66 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 7a f { [dict get $z
9790: 20 73 74 64 53 65 63 6f 6e 64 73 5d 20 6e 65 20 stdSeconds] ne
97a0: 7b 7d 20 7d 20 7b 0a 2d 09 73 65 74 20 73 74 64 {} } {.-.set std
97b0: 53 65 63 6f 6e 64 73 20 5b 6c 69 6e 64 65 78 20 Seconds [lindex
97c0: 5b 3a 3a 73 63 61 6e 20 5b 64 69 63 74 20 67 65 [::scan [dict ge
97d0: 74 20 24 7a 20 73 74 64 53 65 63 6f 6e 64 73 5d t $z stdSeconds]
97e0: 20 25 64 5d 20 30 5d 20 0a 2b 20 20 20 20 69 66 %d] 0] .+ if
97f0: 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a { [::tcl::dict:
9800: 3a 67 65 74 20 24 7a 20 73 74 64 53 65 63 6f 6e :get $z stdSecon
9810: 64 73 5d 20 6e 65 20 7b 7d 20 7d 20 7b 0a 2b 09 ds] ne {} } {.+.
9820: 73 65 74 20 73 74 64 53 65 63 6f 6e 64 73 20 5b set stdSeconds [
9830: 6c 69 6e 64 65 78 20 5b 3a 3a 73 63 61 6e 20 5b lindex [::scan [
9840: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 ::tcl::dict::get
9850: 20 24 7a 20 73 74 64 53 65 63 6f 6e 64 73 5d 20 $z stdSeconds]
9860: 25 64 5d 20 30 5d 20 0a 20 20 20 20 20 7d 20 65 %d] 0] . } e
9870: 6c 73 65 20 7b 0a 20 09 73 65 74 20 73 74 64 53 lse {. .set stdS
9880: 65 63 6f 6e 64 73 20 30 0a 20 20 20 20 20 7d 0a econds 0. }.
9890: 40 40 20 2d 33 38 36 31 2c 37 20 2b 33 38 39 36 @@ -3861,7 +3896
98a0: 2c 37 20 40 40 0d 0a 20 0a 20 20 20 20 20 23 20 ,7 @@.. . #
98b0: 49 66 20 74 68 65 72 65 27 73 20 6e 6f 20 64 61 If there's no da
98c0: 79 6c 69 67 68 74 20 7a 6f 6e 65 2c 20 77 65 27 ylight zone, we'
98d0: 72 65 20 64 6f 6e 65 0a 20 0a 2d 20 20 20 20 73 re done. .- s
98e0: 65 74 20 64 73 74 4e 61 6d 65 20 5b 64 69 63 74 et dstName [dict
98f0: 20 67 65 74 20 24 7a 20 64 73 74 4e 61 6d 65 5d get $z dstName]
9900: 0a 2b 20 20 20 20 73 65 74 20 64 73 74 4e 61 6d .+ set dstNam
9910: 65 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a e [::tcl::dict::
9920: 67 65 74 20 24 7a 20 64 73 74 4e 61 6d 65 5d 0a get $z dstName].
9930: 20 20 20 20 20 69 66 20 7b 20 24 64 73 74 4e 61 if { $dstNa
9940: 6d 65 20 65 71 20 7b 7d 20 7d 20 7b 0a 20 09 72 me eq {} } {. .r
9950: 65 74 75 72 6e 20 24 64 61 74 61 0a 20 20 20 20 eturn $data.
9960: 20 7d 0a 40 40 20 2d 33 38 37 31 2c 32 32 20 2b }.@@ -3871,22 +
9970: 33 39 30 36 2c 32 32 20 40 40 0d 0a 20 0a 20 20 3906,22 @@.. .
9980: 20 20 20 23 20 44 65 74 65 72 6d 69 6e 65 20 74 # Determine t
9990: 68 65 20 64 61 79 6c 69 67 68 74 20 6e 61 6d 65 he daylight name
99a0: 0a 20 0a 2d 20 20 20 20 69 66 20 7b 20 5b 64 69 . .- if { [di
99b0: 63 74 20 67 65 74 20 24 7a 20 64 73 74 53 69 67 ct get $z dstSig
99c0: 6e 75 6d 5d 20 65 71 20 7b 2d 7d 20 7d 20 7b 0a num] eq {-} } {.
99d0: 2b 20 20 20 20 69 66 20 7b 20 5b 3a 3a 74 63 6c + if { [::tcl
99e0: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 7a 20 64 ::dict::get $z d
99f0: 73 74 53 69 67 6e 75 6d 5d 20 65 71 20 7b 2d 7d stSignum] eq {-}
9a00: 20 7d 20 7b 0a 20 09 73 65 74 20 64 73 74 53 69 } {. .set dstSi
9a10: 67 6e 75 6d 20 2b 31 0a 20 20 20 20 20 7d 20 65 gnum +1. } e
9a20: 6c 73 65 20 7b 0a 20 09 73 65 74 20 64 73 74 53 lse {. .set dstS
9a30: 69 67 6e 75 6d 20 2d 31 0a 20 20 20 20 20 7d 0a ignum -1. }.
9a40: 2d 20 20 20 20 69 66 20 7b 20 5b 64 69 63 74 20 - if { [dict
9a50: 67 65 74 20 24 7a 20 64 73 74 48 6f 75 72 73 5d get $z dstHours]
9a60: 20 65 71 20 7b 7d 20 7d 20 7b 0a 2b 20 20 20 20 eq {} } {.+
9a70: 69 66 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 if { [::tcl::dic
9a80: 74 3a 3a 67 65 74 20 24 7a 20 64 73 74 48 6f 75 t::get $z dstHou
9a90: 72 73 5d 20 65 71 20 7b 7d 20 7d 20 7b 0a 20 09 rs] eq {} } {. .
9aa0: 73 65 74 20 64 73 74 4f 66 66 73 65 74 20 5b 65 set dstOffset [e
9ab0: 78 70 72 20 7b 20 33 36 30 30 20 2b 20 24 73 74 xpr { 3600 + $st
9ac0: 64 4f 66 66 73 65 74 20 7d 5d 0a 20 20 20 20 20 dOffset }].
9ad0: 7d 20 65 6c 73 65 20 7b 0a 2d 09 73 65 74 20 64 } else {.-.set d
9ae0: 73 74 48 6f 75 72 73 20 5b 6c 69 6e 64 65 78 20 stHours [lindex
9af0: 5b 3a 3a 73 63 61 6e 20 5b 64 69 63 74 20 67 65 [::scan [dict ge
9b00: 74 20 24 7a 20 64 73 74 48 6f 75 72 73 5d 20 25 t $z dstHours] %
9b10: 64 5d 20 30 5d 20 0a 2d 09 69 66 20 7b 20 5b 64 d] 0] .-.if { [d
9b20: 69 63 74 20 67 65 74 20 24 7a 20 64 73 74 4d 69 ict get $z dstMi
9b30: 6e 75 74 65 73 5d 20 6e 65 20 7b 7d 20 7d 20 7b nutes] ne {} } {
9b40: 0a 2d 09 20 20 20 20 73 65 74 20 64 73 74 4d 69 .-. set dstMi
9b50: 6e 75 74 65 73 20 5b 6c 69 6e 64 65 78 20 5b 3a nutes [lindex [:
9b60: 3a 73 63 61 6e 20 5b 64 69 63 74 20 67 65 74 20 :scan [dict get
9b70: 24 7a 20 64 73 74 4d 69 6e 75 74 65 73 5d 20 25 $z dstMinutes] %
9b80: 64 5d 20 30 5d 20 0a 2b 09 73 65 74 20 64 73 74 d] 0] .+.set dst
9b90: 48 6f 75 72 73 20 5b 6c 69 6e 64 65 78 20 5b 3a Hours [lindex [:
9ba0: 3a 73 63 61 6e 20 5b 3a 3a 74 63 6c 3a 3a 64 69 :scan [::tcl::di
9bb0: 63 74 3a 3a 67 65 74 20 24 7a 20 64 73 74 48 6f ct::get $z dstHo
9bc0: 75 72 73 5d 20 25 64 5d 20 30 5d 20 0a 2b 09 69 urs] %d] 0] .+.i
9bd0: 66 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 f { [::tcl::dict
9be0: 3a 3a 67 65 74 20 24 7a 20 64 73 74 4d 69 6e 75 ::get $z dstMinu
9bf0: 74 65 73 5d 20 6e 65 20 7b 7d 20 7d 20 7b 0a 2b tes] ne {} } {.+
9c00: 09 20 20 20 20 73 65 74 20 64 73 74 4d 69 6e 75 . set dstMinu
9c10: 74 65 73 20 5b 6c 69 6e 64 65 78 20 5b 3a 3a 73 tes [lindex [::s
9c20: 63 61 6e 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 can [::tcl::dict
9c30: 3a 3a 67 65 74 20 24 7a 20 64 73 74 4d 69 6e 75 ::get $z dstMinu
9c40: 74 65 73 5d 20 25 64 5d 20 30 5d 20 0a 20 09 7d tes] %d] 0] . .}
9c50: 20 65 6c 73 65 20 7b 0a 20 09 20 20 20 20 73 65 else {. . se
9c60: 74 20 64 73 74 4d 69 6e 75 74 65 73 20 30 0a 20 t dstMinutes 0.
9c70: 09 7d 0a 2d 09 69 66 20 7b 20 5b 64 69 63 74 20 .}.-.if { [dict
9c80: 67 65 74 20 24 7a 20 64 73 74 53 65 63 6f 6e 64 get $z dstSecond
9c90: 73 5d 20 6e 65 20 7b 7d 20 7d 20 7b 0a 2d 09 20 s] ne {} } {.-.
9ca0: 20 20 20 73 65 74 20 64 73 74 53 65 63 6f 6e 64 set dstSecond
9cb0: 73 20 5b 6c 69 6e 64 65 78 20 5b 3a 3a 73 63 61 s [lindex [::sca
9cc0: 6e 20 5b 64 69 63 74 20 67 65 74 20 24 7a 20 64 n [dict get $z d
9cd0: 73 74 53 65 63 6f 6e 64 73 5d 20 25 64 5d 20 30 stSeconds] %d] 0
9ce0: 5d 20 0a 2b 09 69 66 20 7b 20 5b 3a 3a 74 63 6c ] .+.if { [::tcl
9cf0: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 7a 20 64 ::dict::get $z d
9d00: 73 74 53 65 63 6f 6e 64 73 5d 20 6e 65 20 7b 7d stSeconds] ne {}
9d10: 20 7d 20 7b 0a 2b 09 20 20 20 20 73 65 74 20 64 } {.+. set d
9d20: 73 74 53 65 63 6f 6e 64 73 20 5b 6c 69 6e 64 65 stSeconds [linde
9d30: 78 20 5b 3a 3a 73 63 61 6e 20 5b 3a 3a 74 63 6c x [::scan [::tcl
9d40: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 7a 20 64 ::dict::get $z d
9d50: 73 74 53 65 63 6f 6e 64 73 5d 20 25 64 5d 20 30 stSeconds] %d] 0
9d60: 5d 20 0a 20 09 7d 20 65 6c 73 65 20 7b 0a 20 09 ] . .} else {. .
9d70: 20 20 20 20 73 65 74 20 64 73 74 53 65 63 6f 6e set dstSecon
9d80: 64 73 20 30 0a 20 09 7d 0a 40 40 20 2d 33 39 30 ds 0. .}.@@ -390
9d90: 31 2c 38 20 2b 33 39 33 36 2c 38 20 40 40 0d 0a 1,8 +3936,8 @@..
9da0: 20 20 20 20 20 23 20 55 53 20 65 6e 64 20 74 69 # US end ti
9db0: 6d 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 me is the first
9dc0: 53 75 6e 64 61 79 20 69 6e 20 4e 6f 76 65 6d 62 Sunday in Novemb
9dd0: 65 72 2e 0a 20 20 20 20 20 23 20 45 55 20 65 6e er.. # EU en
9de0: 64 20 74 69 6d 65 20 69 73 20 74 68 65 20 6c 61 d time is the la
9df0: 73 74 20 53 75 6e 64 61 79 20 69 6e 20 4f 63 74 st Sunday in Oct
9e00: 6f 62 65 72 0a 20 0a 2d 20 20 20 20 69 66 20 7b ober. .- if {
9e10: 20 5b 64 69 63 74 20 67 65 74 20 24 7a 20 73 74 [dict get $z st
9e20: 61 72 74 44 61 79 4f 66 59 65 61 72 5d 20 65 71 artDayOfYear] eq
9e30: 20 7b 7d 20 0a 2d 09 20 26 26 20 5b 64 69 63 74 {} .-. && [dict
9e40: 20 67 65 74 20 24 7a 20 73 74 61 72 74 4d 6f 6e get $z startMon
9e50: 74 68 5d 20 65 71 20 7b 7d 20 7d 20 7b 0a 2b 20 th] eq {} } {.+
9e60: 20 20 20 69 66 20 7b 20 5b 3a 3a 74 63 6c 3a 3a if { [::tcl::
9e70: 64 69 63 74 3a 3a 67 65 74 20 24 7a 20 73 74 61 dict::get $z sta
9e80: 72 74 44 61 79 4f 66 59 65 61 72 5d 20 65 71 20 rtDayOfYear] eq
9e90: 7b 7d 20 0a 2b 09 20 26 26 20 5b 3a 3a 74 63 6c {} .+. && [::tcl
9ea0: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 7a 20 73 ::dict::get $z s
9eb0: 74 61 72 74 4d 6f 6e 74 68 5d 20 65 71 20 7b 7d tartMonth] eq {}
9ec0: 20 7d 20 7b 0a 20 09 69 66 20 7b 28 24 73 74 64 } {. .if {($std
9ed0: 53 69 67 6e 75 6d 20 2a 20 24 73 74 64 48 6f 75 Signum * $stdHou
9ee0: 72 73 3e 3d 30 29 20 26 26 20 28 24 73 74 64 53 rs>=0) && ($stdS
9ef0: 69 67 6e 75 6d 20 2a 20 24 73 74 64 48 6f 75 72 ignum * $stdHour
9f00: 73 3c 3d 31 32 29 7d 20 7b 0a 20 09 20 20 20 20 s<=12)} {. .
9f10: 23 20 45 55 0a 20 09 20 20 20 20 64 69 63 74 20 # EU. . dict
9f20: 73 65 74 20 7a 20 73 74 61 72 74 57 65 65 6b 4f set z startWeekO
9f30: 66 4d 6f 6e 74 68 20 35 0a 40 40 20 2d 33 39 32 fMonth 5.@@ -392
9f40: 31 2c 38 20 2b 33 39 35 36 2c 38 20 40 40 0d 0a 1,8 +3956,8 @@..
9f50: 20 09 64 69 63 74 20 73 65 74 20 7a 20 73 74 61 .dict set z sta
9f60: 72 74 4d 69 6e 75 74 65 73 20 30 0a 20 09 64 69 rtMinutes 0. .di
9f70: 63 74 20 73 65 74 20 7a 20 73 74 61 72 74 53 65 ct set z startSe
9f80: 63 6f 6e 64 73 20 30 0a 20 20 20 20 20 7d 0a 2d conds 0. }.-
9f90: 20 20 20 20 69 66 20 7b 20 5b 64 69 63 74 20 67 if { [dict g
9fa0: 65 74 20 24 7a 20 65 6e 64 44 61 79 4f 66 59 65 et $z endDayOfYe
9fb0: 61 72 5d 20 65 71 20 7b 7d 20 0a 2d 09 20 26 26 ar] eq {} .-. &&
9fc0: 20 5b 64 69 63 74 20 67 65 74 20 24 7a 20 65 6e [dict get $z en
9fd0: 64 4d 6f 6e 74 68 5d 20 65 71 20 7b 7d 20 7d 20 dMonth] eq {} }
9fe0: 7b 0a 2b 20 20 20 20 69 66 20 7b 20 5b 3a 3a 74 {.+ if { [::t
9ff0: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 7a cl::dict::get $z
a000: 20 65 6e 64 44 61 79 4f 66 59 65 61 72 5d 20 65 endDayOfYear] e
a010: 71 20 7b 7d 20 0a 2b 09 20 26 26 20 5b 3a 3a 74 q {} .+. && [::t
a020: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 7a cl::dict::get $z
a030: 20 65 6e 64 4d 6f 6e 74 68 5d 20 65 71 20 7b 7d endMonth] eq {}
a040: 20 7d 20 7b 0a 20 09 69 66 20 7b 28 24 73 74 64 } {. .if {($std
a050: 53 69 67 6e 75 6d 20 2a 20 24 73 74 64 48 6f 75 Signum * $stdHou
a060: 72 73 3e 3d 30 29 20 26 26 20 28 24 73 74 64 53 rs>=0) && ($stdS
a070: 69 67 6e 75 6d 20 2a 20 24 73 74 64 48 6f 75 72 ignum * $stdHour
a080: 73 3c 3d 31 32 29 7d 20 7b 0a 20 09 20 20 20 20 s<=12)} {. .
a090: 23 20 45 55 0a 20 09 20 20 20 20 64 69 63 74 20 # EU. . dict
a0a0: 73 65 74 20 7a 20 65 6e 64 4d 6f 6e 74 68 20 31 set z endMonth 1
a0b0: 30 0a 40 40 20 2d 33 39 39 31 2c 31 33 20 2b 34 0.@@ -3991,13 +4
a0c0: 30 32 36 2c 31 33 20 40 40 0d 0a 20 0a 20 20 20 026,13 @@.. .
a0d0: 20 20 23 20 44 65 74 65 72 6d 69 6e 65 20 74 68 # Determine th
a0e0: 65 20 73 74 61 72 74 20 6f 72 20 65 6e 64 20 64 e start or end d
a0f0: 61 79 20 6f 66 20 44 53 54 0a 20 0a 2d 20 20 20 ay of DST. .-
a100: 20 73 65 74 20 64 61 74 65 20 5b 64 69 63 74 20 set date [dict
a110: 63 72 65 61 74 65 20 65 72 61 20 43 45 20 79 65 create era CE ye
a120: 61 72 20 24 79 5d 0a 2d 20 20 20 20 73 65 74 20 ar $y].- set
a130: 64 6f 79 20 5b 64 69 63 74 20 67 65 74 20 24 7a doy [dict get $z
a140: 20 24 7b 62 6f 75 6e 64 7d 44 61 79 4f 66 59 65 ${bound}DayOfYe
a150: 61 72 5d 0a 2b 20 20 20 20 73 65 74 20 64 61 74 ar].+ set dat
a160: 65 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a e [::tcl::dict::
a170: 63 72 65 61 74 65 20 65 72 61 20 43 45 20 79 65 create era CE ye
a180: 61 72 20 24 79 5d 0a 2b 20 20 20 20 73 65 74 20 ar $y].+ set
a190: 64 6f 79 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 doy [::tcl::dict
a1a0: 3a 3a 67 65 74 20 24 7a 20 24 7b 62 6f 75 6e 64 ::get $z ${bound
a1b0: 7d 44 61 79 4f 66 59 65 61 72 5d 0a 20 20 20 20 }DayOfYear].
a1c0: 20 69 66 20 7b 20 24 64 6f 79 20 6e 65 20 7b 7d if { $doy ne {}
a1d0: 20 7d 20 7b 0a 20 0a 20 09 23 20 54 69 6d 65 20 } {. . .# Time
a1e0: 77 61 73 20 73 70 65 63 69 66 69 65 64 20 61 73 was specified as
a1f0: 20 61 20 64 61 79 20 6f 66 20 74 68 65 20 79 65 a day of the ye
a200: 61 72 0a 20 0a 2d 09 69 66 20 7b 20 5b 64 69 63 ar. .-.if { [dic
a210: 74 20 67 65 74 20 24 7a 20 24 7b 62 6f 75 6e 64 t get $z ${bound
a220: 7d 4a 5d 20 6e 65 20 7b 7d 0a 2b 09 69 66 20 7b }J] ne {}.+.if {
a230: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 [::tcl::dict::g
a240: 65 74 20 24 7a 20 24 7b 62 6f 75 6e 64 7d 4a 5d et $z ${bound}J]
a250: 20 6e 65 20 7b 7d 0a 20 09 20 20 20 20 20 26 26 ne {}. . &&
a260: 20 5b 49 73 47 72 65 67 6f 72 69 61 6e 4c 65 61 [IsGregorianLea
a270: 70 59 65 61 72 20 24 79 5d 20 0a 20 09 20 20 20 pYear $y] . .
a280: 20 20 26 26 20 28 20 24 64 6f 79 20 3e 20 24 46 && ( $doy > $F
a290: 45 42 5f 32 38 20 29 20 7d 20 7b 0a 20 09 20 20 EB_28 ) } {. .
a2a0: 20 20 69 6e 63 72 20 64 6f 79 0a 40 40 20 2d 34 incr doy.@@ -4
a2b0: 30 30 38 2c 39 20 2b 34 30 34 33 2c 39 20 40 40 008,9 +4043,9 @@
a2c0: 0d 0a 20 0a 20 09 23 20 54 69 6d 65 20 77 61 73 .. . .# Time was
a2d0: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 61 20 specified as a
a2e0: 64 61 79 20 6f 66 20 74 68 65 20 77 65 65 6b 20 day of the week
a2f0: 77 69 74 68 69 6e 20 61 20 6d 6f 6e 74 68 0a 20 within a month.
a300: 0a 2d 09 64 69 63 74 20 73 65 74 20 64 61 74 65 .-.dict set date
a310: 20 6d 6f 6e 74 68 20 5b 64 69 63 74 20 67 65 74 month [dict get
a320: 20 24 7a 20 24 7b 62 6f 75 6e 64 7d 4d 6f 6e 74 $z ${bound}Mont
a330: 68 5d 0a 2d 09 64 69 63 74 20 73 65 74 20 64 61 h].-.dict set da
a340: 74 65 20 64 61 79 4f 66 57 65 65 6b 20 5b 64 69 te dayOfWeek [di
a350: 63 74 20 67 65 74 20 24 7a 20 24 7b 62 6f 75 6e ct get $z ${boun
a360: 64 7d 44 61 79 4f 66 57 65 65 6b 5d 0a 2d 09 73 d}DayOfWeek].-.s
a370: 65 74 20 64 6f 77 69 6d 20 5b 64 69 63 74 20 67 et dowim [dict g
a380: 65 74 20 24 7a 20 24 7b 62 6f 75 6e 64 7d 57 65 et $z ${bound}We
a390: 65 6b 4f 66 4d 6f 6e 74 68 5d 0a 2b 09 64 69 63 ekOfMonth].+.dic
a3a0: 74 20 73 65 74 20 64 61 74 65 20 6d 6f 6e 74 68 t set date month
a3b0: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 [::tcl::dict::g
a3c0: 65 74 20 24 7a 20 24 7b 62 6f 75 6e 64 7d 4d 6f et $z ${bound}Mo
a3d0: 6e 74 68 5d 0a 2b 09 64 69 63 74 20 73 65 74 20 nth].+.dict set
a3e0: 64 61 74 65 20 64 61 79 4f 66 57 65 65 6b 20 5b date dayOfWeek [
a3f0: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 ::tcl::dict::get
a400: 20 24 7a 20 24 7b 62 6f 75 6e 64 7d 44 61 79 4f $z ${bound}DayO
a410: 66 57 65 65 6b 5d 0a 2b 09 73 65 74 20 64 6f 77 fWeek].+.set dow
a420: 69 6d 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a im [::tcl::dict:
a430: 3a 67 65 74 20 24 7a 20 24 7b 62 6f 75 6e 64 7d :get $z ${bound}
a440: 57 65 65 6b 4f 66 4d 6f 6e 74 68 5d 0a 20 09 69 WeekOfMonth]. .i
a450: 66 20 7b 20 24 64 6f 77 69 6d 20 3e 3d 20 35 20 f { $dowim >= 5
a460: 7d 20 7b 0a 20 09 20 20 20 20 73 65 74 20 64 6f } {. . set do
a470: 77 69 6d 20 2d 31 0a 20 09 7d 0a 40 40 20 2d 34 wim -1. .}.@@ -4
a480: 30 31 39 2c 32 33 20 2b 34 30 35 34 2c 32 33 20 019,23 +4054,23
a490: 40 40 0d 0a 20 0a 20 20 20 20 20 7d 0a 20 0a 2d @@.. . }. .-
a4a0: 20 20 20 20 73 65 74 20 6a 64 20 5b 64 69 63 74 set jd [dict
a4b0: 20 67 65 74 20 24 64 61 74 65 20 6a 75 6c 69 61 get $date julia
a4c0: 6e 44 61 79 5d 0a 2b 20 20 20 20 73 65 74 20 6a nDay].+ set j
a4d0: 64 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a d [::tcl::dict::
a4e0: 67 65 74 20 24 64 61 74 65 20 6a 75 6c 69 61 6e get $date julian
a4f0: 44 61 79 5d 0a 20 20 20 20 20 73 65 74 20 73 65 Day]. set se
a500: 63 6f 6e 64 73 20 5b 65 78 70 72 20 7b 20 77 69 conds [expr { wi
a510: 64 65 28 24 6a 64 29 20 2a 20 77 69 64 65 28 38 de($jd) * wide(8
a520: 36 34 30 30 29 0a 20 09 09 09 2d 20 77 69 64 65 6400). ...- wide
a530: 28 32 31 30 38 36 36 38 30 33 32 30 30 29 20 7d (210866803200) }
a540: 5d 0a 20 0a 2d 20 20 20 20 73 65 74 20 68 20 5b ]. .- set h [
a550: 64 69 63 74 20 67 65 74 20 24 7a 20 24 7b 62 6f dict get $z ${bo
a560: 75 6e 64 7d 48 6f 75 72 73 5d 0a 2b 20 20 20 20 und}Hours].+
a570: 73 65 74 20 68 20 5b 3a 3a 74 63 6c 3a 3a 64 69 set h [::tcl::di
a580: 63 74 3a 3a 67 65 74 20 24 7a 20 24 7b 62 6f 75 ct::get $z ${bou
a590: 6e 64 7d 48 6f 75 72 73 5d 0a 20 20 20 20 20 69 nd}Hours]. i
a5a0: 66 20 7b 20 24 68 20 65 71 20 7b 7d 20 7d 20 7b f { $h eq {} } {
a5b0: 0a 20 09 73 65 74 20 68 20 32 0a 20 20 20 20 20 . .set h 2.
a5c0: 7d 20 65 6c 73 65 20 7b 0a 20 09 73 65 74 20 68 } else {. .set h
a5d0: 20 5b 6c 69 6e 64 65 78 20 5b 3a 3a 73 63 61 6e [lindex [::scan
a5e0: 20 24 68 20 25 64 5d 20 30 5d 0a 20 20 20 20 20 $h %d] 0].
a5f0: 7d 0a 2d 20 20 20 20 73 65 74 20 6d 20 5b 64 69 }.- set m [di
a600: 63 74 20 67 65 74 20 24 7a 20 24 7b 62 6f 75 6e ct get $z ${boun
a610: 64 7d 4d 69 6e 75 74 65 73 5d 0a 2b 20 20 20 20 d}Minutes].+
a620: 73 65 74 20 6d 20 5b 3a 3a 74 63 6c 3a 3a 64 69 set m [::tcl::di
a630: 63 74 3a 3a 67 65 74 20 24 7a 20 24 7b 62 6f 75 ct::get $z ${bou
a640: 6e 64 7d 4d 69 6e 75 74 65 73 5d 0a 20 20 20 20 nd}Minutes].
a650: 20 69 66 20 7b 20 24 6d 20 65 71 20 7b 7d 20 7d if { $m eq {} }
a660: 20 7b 0a 20 09 73 65 74 20 6d 20 30 0a 20 20 20 {. .set m 0.
a670: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 09 73 65 74 } else {. .set
a680: 20 6d 20 5b 6c 69 6e 64 65 78 20 5b 3a 3a 73 63 m [lindex [::sc
a690: 61 6e 20 24 6d 20 25 64 5d 20 30 5d 0a 20 20 20 an $m %d] 0].
a6a0: 20 20 7d 0a 2d 20 20 20 20 73 65 74 20 73 20 5b }.- set s [
a6b0: 64 69 63 74 20 67 65 74 20 24 7a 20 24 7b 62 6f dict get $z ${bo
a6c0: 75 6e 64 7d 53 65 63 6f 6e 64 73 5d 0a 2b 20 20 und}Seconds].+
a6d0: 20 20 73 65 74 20 73 20 5b 3a 3a 74 63 6c 3a 3a set s [::tcl::
a6e0: 64 69 63 74 3a 3a 67 65 74 20 24 7a 20 24 7b 62 dict::get $z ${b
a6f0: 6f 75 6e 64 7d 53 65 63 6f 6e 64 73 5d 0a 20 20 ound}Seconds].
a700: 20 20 20 69 66 20 7b 20 24 73 20 65 71 20 7b 7d if { $s eq {}
a710: 20 7d 20 7b 0a 20 09 73 65 74 20 73 20 30 0a 20 } {. .set s 0.
a720: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 40 40 20 } else {.@@
a730: 2d 34 30 36 38 2c 31 35 20 2b 34 31 30 33 2c 31 -4068,15 +4103,1
a740: 35 20 40 40 0d 0a 20 0a 20 70 72 6f 63 20 3a 3a 5 @@.. . proc ::
a750: 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 47 65 74 4c tcl::clock::GetL
a760: 6f 63 61 6c 65 45 72 61 20 7b 20 64 61 74 65 20 ocaleEra { date
a770: 65 74 61 62 6c 65 20 7d 20 7b 0a 20 0a 2d 20 20 etable } {. .-
a780: 20 20 73 65 74 20 69 6e 64 65 78 20 5b 42 53 65 set index [BSe
a790: 61 72 63 68 20 24 65 74 61 62 6c 65 20 5b 64 69 arch $etable [di
a7a0: 63 74 20 67 65 74 20 24 64 61 74 65 20 6c 6f 63 ct get $date loc
a7b0: 61 6c 53 65 63 6f 6e 64 73 5d 5d 0a 2b 20 20 20 alSeconds]].+
a7c0: 20 73 65 74 20 69 6e 64 65 78 20 5b 42 53 65 61 set index [BSea
a7d0: 72 63 68 20 24 65 74 61 62 6c 65 20 5b 3a 3a 74 rch $etable [::t
a7e0: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 cl::dict::get $d
a7f0: 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 ate localSeconds
a800: 5d 5d 0a 20 20 20 20 20 69 66 20 7b 20 24 69 6e ]]. if { $in
a810: 64 65 78 20 3c 20 30 7d 20 7b 0a 20 09 64 69 63 dex < 0} {. .dic
a820: 74 20 73 65 74 20 64 61 74 65 20 6c 6f 63 61 6c t set date local
a830: 65 45 72 61 20 5c 0a 2d 09 20 20 20 20 5b 3a 3a eEra \.-. [::
a840: 66 6f 72 6d 61 74 20 25 30 32 64 20 5b 65 78 70 format %02d [exp
a850: 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64 r { [dict get $d
a860: 61 74 65 20 79 65 61 72 5d 20 2f 20 31 30 30 20 ate year] / 100
a870: 7d 5d 5d 0a 2b 09 20 20 20 20 5b 3a 3a 66 6f 72 }]].+. [::for
a880: 6d 61 74 20 25 30 32 64 20 5b 65 78 70 72 20 7b mat %02d [expr {
a890: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 [::tcl::dict::g
a8a0: 65 74 20 24 64 61 74 65 20 79 65 61 72 5d 20 2f et $date year] /
a8b0: 20 31 30 30 20 7d 5d 5d 0a 20 09 64 69 63 74 20 100 }]]. .dict
a8c0: 73 65 74 20 64 61 74 65 20 6c 6f 63 61 6c 65 59 set date localeY
a8d0: 65 61 72 20 5c 0a 2d 09 20 20 20 20 5b 65 78 70 ear \.-. [exp
a8e0: 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64 r { [dict get $d
a8f0: 61 74 65 20 79 65 61 72 5d 20 25 20 31 30 30 20 ate year] % 100
a900: 7d 5d 0a 2b 09 20 20 20 20 5b 65 78 70 72 20 7b }].+. [expr {
a910: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 [::tcl::dict::g
a920: 65 74 20 24 64 61 74 65 20 79 65 61 72 5d 20 25 et $date year] %
a930: 20 31 30 30 20 7d 5d 0a 20 20 20 20 20 7d 20 65 100 }]. } e
a940: 6c 73 65 20 7b 0a 20 09 64 69 63 74 20 73 65 74 lse {. .dict set
a950: 20 64 61 74 65 20 6c 6f 63 61 6c 65 45 72 61 20 date localeEra
a960: 5b 6c 69 6e 64 65 78 20 24 65 74 61 62 6c 65 20 [lindex $etable
a970: 24 69 6e 64 65 78 20 31 5d 0a 2d 09 64 69 63 74 $index 1].-.dict
a980: 20 73 65 74 20 64 61 74 65 20 6c 6f 63 61 6c 65 set date locale
a990: 59 65 61 72 20 5b 65 78 70 72 20 7b 20 5b 64 69 Year [expr { [di
a9a0: 63 74 20 67 65 74 20 24 64 61 74 65 20 79 65 61 ct get $date yea
a9b0: 72 5d 20 0a 2b 09 64 69 63 74 20 73 65 74 20 64 r] .+.dict set d
a9c0: 61 74 65 20 6c 6f 63 61 6c 65 59 65 61 72 20 5b ate localeYear [
a9d0: 65 78 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 expr { [::tcl::d
a9e0: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 79 ict::get $date y
a9f0: 65 61 72 5d 20 0a 20 09 09 09 09 09 20 2d 20 5b ear] . ..... - [
aa00: 6c 69 6e 64 65 78 20 24 65 74 61 62 6c 65 20 24 lindex $etable $
aa10: 69 6e 64 65 78 20 32 5d 20 7d 5d 0a 20 20 20 20 index 2] }].
aa20: 20 7d 0a 20 20 20 20 20 72 65 74 75 72 6e 20 24 }. return $
aa30: 64 61 74 65 0a 40 40 20 2d 34 31 31 35 2c 31 32 date.@@ -4115,12
aa40: 20 2b 34 31 35 30 2c 31 32 20 40 40 0d 0a 20 0a +4150,12 @@.. .
aa50: 20 20 20 20 20 23 20 47 65 74 20 61 62 73 6f 6c # Get absol
aa60: 75 74 65 20 79 65 61 72 20 6e 75 6d 62 65 72 20 ute year number
aa70: 66 72 6f 6d 20 74 68 65 20 63 69 76 69 6c 20 79 from the civil y
aa80: 65 61 72 0a 20 0a 2d 20 20 20 20 73 77 69 74 63 ear. .- switc
aa90: 68 20 2d 65 78 61 63 74 20 2d 2d 20 5b 64 69 63 h -exact -- [dic
aaa0: 74 20 67 65 74 20 24 64 61 74 65 20 65 72 61 5d t get $date era]
aab0: 20 7b 0a 2b 20 20 20 20 73 77 69 74 63 68 20 2d {.+ switch -
aac0: 65 78 61 63 74 20 2d 2d 20 5b 3a 3a 74 63 6c 3a exact -- [::tcl:
aad0: 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 :dict::get $date
aae0: 20 65 72 61 5d 20 7b 0a 20 09 42 43 45 20 7b 0a era] {. .BCE {.
aaf0: 2d 09 20 20 20 20 73 65 74 20 79 65 61 72 20 5b -. set year [
ab00: 65 78 70 72 20 7b 20 31 20 2d 20 5b 64 69 63 74 expr { 1 - [dict
ab10: 20 67 65 74 20 24 64 61 74 65 20 79 65 61 72 5d get $date year]
ab20: 20 7d 5d 0a 2b 09 20 20 20 20 73 65 74 20 79 65 }].+. set ye
ab30: 61 72 20 5b 65 78 70 72 20 7b 20 31 20 2d 20 5b ar [expr { 1 - [
ab40: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 ::tcl::dict::get
ab50: 20 24 64 61 74 65 20 79 65 61 72 5d 20 7d 5d 0a $date year] }].
ab60: 20 09 7d 0a 20 09 43 45 20 7b 0a 2d 09 20 20 20 .}. .CE {.-.
ab70: 20 73 65 74 20 79 65 61 72 20 5b 64 69 63 74 20 set year [dict
ab80: 67 65 74 20 24 64 61 74 65 20 79 65 61 72 5d 0a get $date year].
ab90: 2b 09 20 20 20 20 73 65 74 20 79 65 61 72 20 5b +. set year [
aba0: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 ::tcl::dict::get
abb0: 20 24 64 61 74 65 20 79 65 61 72 5d 0a 20 09 7d $date year]. .}
abc0: 0a 20 20 20 20 20 7d 0a 20 20 20 20 20 73 65 74 . }. set
abd0: 20 79 6d 31 20 5b 65 78 70 72 20 7b 20 24 79 65 ym1 [expr { $ye
abe0: 61 72 20 2d 20 31 20 7d 5d 0a 40 40 20 2d 34 31 ar - 1 }].@@ -41
abf0: 32 39 2c 37 20 2b 34 31 36 34 2c 37 20 40 40 0d 29,7 +4164,7 @@.
ac00: 0a 20 0a 20 20 20 20 20 64 69 63 74 20 73 65 74 . . dict set
ac10: 20 64 61 74 65 20 67 72 65 67 6f 72 69 61 6e 20 date gregorian
ac20: 31 0a 20 20 20 20 20 73 65 74 20 6a 64 20 5b 65 1. set jd [e
ac30: 78 70 72 20 7b 20 31 37 32 31 34 32 35 0a 2d 09 xpr { 1721425.-.
ac40: 09 20 20 20 2b 20 5b 64 69 63 74 20 67 65 74 20 . + [dict get
ac50: 24 64 61 74 65 20 64 61 79 4f 66 59 65 61 72 5d $date dayOfYear]
ac60: 0a 2b 09 09 20 20 20 2b 20 5b 3a 3a 74 63 6c 3a .+.. + [::tcl:
ac70: 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 :dict::get $date
ac80: 20 64 61 79 4f 66 59 65 61 72 5d 0a 20 09 09 20 dayOfYear]. ..
ac90: 20 20 2b 20 28 20 33 36 35 20 2a 20 24 79 6d 31 + ( 365 * $ym1
aca0: 20 29 0a 20 09 09 20 20 20 2b 20 28 20 24 79 6d ). .. + ( $ym
acb0: 31 20 2f 20 34 20 29 0a 20 09 09 20 20 20 2d 20 1 / 4 ). .. -
acc0: 28 20 24 79 6d 31 20 2f 20 31 30 30 20 29 0a 40 ( $ym1 / 100 ).@
acd0: 40 20 2d 34 31 34 30 2c 37 20 2b 34 31 37 35 2c @ -4140,7 +4175,
ace0: 37 20 40 40 0d 0a 20 20 20 20 20 69 66 20 7b 20 7 @@.. if {
acf0: 24 6a 64 20 3c 20 24 63 68 61 6e 67 65 6f 76 65 $jd < $changeove
ad00: 72 20 7d 20 7b 0a 20 09 64 69 63 74 20 73 65 74 r } {. .dict set
ad10: 20 64 61 74 65 20 67 72 65 67 6f 72 69 61 6e 20 date gregorian
ad20: 30 0a 20 09 73 65 74 20 6a 64 20 5b 65 78 70 72 0. .set jd [expr
ad30: 20 7b 20 31 37 32 31 34 32 33 0a 2d 09 09 20 20 { 1721423.-..
ad40: 20 20 20 20 20 2b 20 5b 64 69 63 74 20 67 65 74 + [dict get
ad50: 20 24 64 61 74 65 20 64 61 79 4f 66 59 65 61 72 $date dayOfYear
ad60: 5d 0a 2b 09 09 20 20 20 20 20 20 20 2b 20 5b 3a ].+.. + [:
ad70: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 :tcl::dict::get
ad80: 24 64 61 74 65 20 64 61 79 4f 66 59 65 61 72 5d $date dayOfYear]
ad90: 0a 20 09 09 20 20 20 20 20 20 20 2b 20 28 20 33 . .. + ( 3
ada0: 36 35 20 2a 20 24 79 6d 31 20 29 0a 20 09 09 20 65 * $ym1 ). ..
adb0: 20 20 20 20 20 20 2b 20 28 20 24 79 6d 31 20 2f + ( $ym1 /
adc0: 20 34 20 29 20 7d 5d 0a 20 20 20 20 20 7d 0a 40 4 ) }]. }.@
add0: 40 20 2d 34 31 37 39 2c 37 20 2b 34 32 31 34 2c @ -4179,7 +4214,
ade0: 37 20 40 40 0d 0a 20 20 20 20 20 23 20 66 6f 6c 7 @@.. # fol
adf0: 6c 6f 77 69 6e 67 20 6d 6f 6e 74 68 20 28 64 61 lowing month (da
ae00: 79 4f 66 57 65 65 6b 49 6e 4d 6f 6e 74 68 20 3c yOfWeekInMonth <
ae10: 20 30 29 0a 20 0a 20 20 20 20 20 73 65 74 20 64 0). . set d
ae20: 61 74 65 32 20 24 64 61 74 65 0a 2d 20 20 20 20 ate2 $date.-
ae30: 73 65 74 20 77 65 65 6b 20 5b 64 69 63 74 20 67 set week [dict g
ae40: 65 74 20 24 64 61 74 65 20 64 61 79 4f 66 57 65 et $date dayOfWe
ae50: 65 6b 49 6e 4d 6f 6e 74 68 5d 0a 2b 20 20 20 20 ekInMonth].+
ae60: 73 65 74 20 77 65 65 6b 20 5b 3a 3a 74 63 6c 3a set week [::tcl:
ae70: 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 :dict::get $date
ae80: 20 64 61 79 4f 66 57 65 65 6b 49 6e 4d 6f 6e 74 dayOfWeekInMont
ae90: 68 5d 0a 20 20 20 20 20 69 66 20 7b 20 24 77 65 h]. if { $we
aea0: 65 6b 20 3e 3d 20 30 20 7d 20 7b 0a 20 09 64 69 ek >= 0 } {. .di
aeb0: 63 74 20 73 65 74 20 64 61 74 65 32 20 64 61 79 ct set date2 day
aec0: 4f 66 4d 6f 6e 74 68 20 30 0a 20 20 20 20 20 7d OfMonth 0. }
aed0: 20 65 6c 73 65 20 7b 0a 40 40 20 2d 34 31 38 38 else {.@@ -4188
aee0: 2c 38 20 2b 34 32 32 33 2c 38 20 40 40 0d 0a 20 ,8 +4223,8 @@..
aef0: 20 20 20 20 7d 0a 20 20 20 20 20 73 65 74 20 64 }. set d
af00: 61 74 65 32 20 5b 47 65 74 4a 75 6c 69 61 6e 44 ate2 [GetJulianD
af10: 61 79 46 72 6f 6d 45 72 61 59 65 61 72 4d 6f 6e ayFromEraYearMon
af20: 74 68 44 61 79 20 24 64 61 74 65 32 5b 73 65 74 thDay $date2[set
af30: 20 64 61 74 65 32 20 7b 7d 5d 20 5c 0a 20 09 09 date2 {}] \. ..
af40: 20 20 20 24 63 68 61 6e 67 65 6f 76 65 72 5d 0a $changeover].
af50: 2d 20 20 20 20 73 65 74 20 77 64 30 20 5b 57 65 - set wd0 [We
af60: 65 6b 64 61 79 4f 6e 4f 72 42 65 66 6f 72 65 20 ekdayOnOrBefore
af70: 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20 [dict get $date
af80: 64 61 79 4f 66 57 65 65 6b 5d 20 5c 0a 2d 09 09 dayOfWeek] \.-..
af90: 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65 [dict get $date
afa0: 32 20 6a 75 6c 69 61 6e 44 61 79 5d 5d 0a 2b 20 2 julianDay]].+
afb0: 20 20 20 73 65 74 20 77 64 30 20 5b 57 65 65 6b set wd0 [Week
afc0: 64 61 79 4f 6e 4f 72 42 65 66 6f 72 65 20 5b 3a dayOnOrBefore [:
afd0: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 :tcl::dict::get
afe0: 24 64 61 74 65 20 64 61 79 4f 66 57 65 65 6b 5d $date dayOfWeek]
aff0: 20 5c 0a 2b 09 09 20 5b 3a 3a 74 63 6c 3a 3a 64 \.+.. [::tcl::d
b000: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 32 20 ict::get $date2
b010: 6a 75 6c 69 61 6e 44 61 79 5d 5d 0a 20 20 20 20 julianDay]].
b020: 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20 6a dict set date j
b030: 75 6c 69 61 6e 44 61 79 20 5b 65 78 70 72 20 7b ulianDay [expr {
b040: 20 24 77 64 30 20 2b 20 37 20 2a 20 24 77 65 65 $wd0 + 7 * $wee
b050: 6b 20 7d 5d 0a 20 20 20 20 20 72 65 74 75 72 6e k }]. return
b060: 20 24 64 61 74 65 0a 20 0a 40 40 20 2d 34 32 31 $date. .@@ -421
b070: 36 2c 31 37 20 2b 34 32 35 31 2c 31 37 20 40 40 6,17 +4251,17 @@
b080: 0d 0a 20 0a 20 70 72 6f 63 20 3a 3a 74 63 6c 3a .. . proc ::tcl:
b090: 3a 63 6c 6f 63 6b 3a 3a 49 73 47 72 65 67 6f 72 :clock::IsGregor
b0a0: 69 61 6e 4c 65 61 70 59 65 61 72 20 7b 20 64 61 ianLeapYear { da
b0b0: 74 65 20 7d 20 7b 0a 20 0a 2d 20 20 20 20 73 77 te } {. .- sw
b0c0: 69 74 63 68 20 2d 65 78 61 63 74 20 2d 2d 20 5b itch -exact -- [
b0d0: 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20 65 dict get $date e
b0e0: 72 61 5d 20 7b 0a 2b 20 20 20 20 73 77 69 74 63 ra] {.+ switc
b0f0: 68 20 2d 65 78 61 63 74 20 2d 2d 20 5b 3a 3a 74 h -exact -- [::t
b100: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 cl::dict::get $d
b110: 61 74 65 20 65 72 61 5d 20 7b 0a 20 09 42 43 45 ate era] {. .BCE
b120: 20 7b 20 0a 2d 09 20 20 20 20 73 65 74 20 79 65 { .-. set ye
b130: 61 72 20 5b 65 78 70 72 20 7b 20 31 20 2d 20 5b ar [expr { 1 - [
b140: 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20 79 dict get $date y
b150: 65 61 72 5d 7d 5d 0a 2b 09 20 20 20 20 73 65 74 ear]}].+. set
b160: 20 79 65 61 72 20 5b 65 78 70 72 20 7b 20 31 20 year [expr { 1
b170: 2d 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a - [::tcl::dict::
b180: 67 65 74 20 24 64 61 74 65 20 79 65 61 72 5d 7d get $date year]}
b190: 5d 0a 20 09 7d 0a 20 09 43 45 20 7b 0a 2d 09 20 ]. .}. .CE {.-.
b1a0: 20 20 20 73 65 74 20 79 65 61 72 20 5b 64 69 63 set year [dic
b1b0: 74 20 67 65 74 20 24 64 61 74 65 20 79 65 61 72 t get $date year
b1c0: 5d 0a 2b 09 20 20 20 20 73 65 74 20 79 65 61 72 ].+. set year
b1d0: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 [::tcl::dict::g
b1e0: 65 74 20 24 64 61 74 65 20 79 65 61 72 5d 0a 20 et $date year].
b1f0: 09 7d 0a 20 20 20 20 20 7d 0a 20 20 20 20 20 69 .}. }. i
b200: 66 20 7b 20 24 79 65 61 72 20 25 20 34 20 21 3d f { $year % 4 !=
b210: 20 30 20 7d 20 7b 0a 20 09 72 65 74 75 72 6e 20 0 } {. .return
b220: 30 0a 2d 20 20 20 20 7d 20 65 6c 73 65 69 66 20 0.- } elseif
b230: 7b 20 21 5b 64 69 63 74 20 67 65 74 20 24 64 61 { ![dict get $da
b240: 74 65 20 67 72 65 67 6f 72 69 61 6e 5d 20 7d 20 te gregorian] }
b250: 7b 0a 2b 20 20 20 20 7d 20 65 6c 73 65 69 66 20 {.+ } elseif
b260: 7b 20 21 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a { ![::tcl::dict:
b270: 3a 67 65 74 20 24 64 61 74 65 20 67 72 65 67 6f :get $date grego
b280: 72 69 61 6e 5d 20 7d 20 7b 0a 20 09 72 65 74 75 rian] } {. .retu
b290: 72 6e 20 31 0a 20 20 20 20 20 7d 20 65 6c 73 65 rn 1. } else
b2a0: 69 66 20 7b 20 24 79 65 61 72 20 25 20 34 30 30 if { $year % 400
b2b0: 20 3d 3d 20 30 20 7d 20 7b 0a 20 09 72 65 74 75 == 0 } {. .retu
b2c0: 72 6e 20 31 0a 40 40 20 2d 34 34 32 34 2c 37 20 rn 1.@@ -4424,7
b2d0: 2b 34 34 35 39 2c 39 20 40 40 0d 0a 20 09 7d 0a +4459,9 @@.. .}.
b2e0: 20 20 20 20 20 7d 0a 20 0a 2d 20 20 20 20 45 6e }. .- En
b2f0: 74 65 72 4c 6f 63 61 6c 65 20 24 6c 6f 63 61 6c terLocale $local
b300: 65 20 6f 6c 64 4c 6f 63 61 6c 65 0a 2b 20 20 20 e oldLocale.+
b310: 20 69 66 20 7b 20 24 6c 6f 63 61 6c 65 20 6e 65 if { $locale ne
b320: 20 7b 63 7d 20 26 26 20 24 6c 6f 63 61 6c 65 20 {c} && $locale
b330: 6e 65 20 5b 6d 63 6c 6f 63 61 6c 65 5d 20 7d 20 ne [mclocale] }
b340: 7b 0a 2b 20 20 20 20 20 20 45 6e 74 65 72 4c 6f {.+ EnterLo
b350: 63 61 6c 65 20 24 6c 6f 63 61 6c 65 20 6f 6c 64 cale $locale old
b360: 4c 6f 63 61 6c 65 0a 2b 20 20 20 20 7d 0a 20 20 Locale.+ }.
b370: 20 20 20 0a 20 20 20 20 20 73 65 74 20 63 68 61 . set cha
b380: 6e 67 65 6f 76 65 72 20 5b 6d 63 20 47 52 45 47 ngeover [mc GREG
b390: 4f 52 49 41 4e 5f 43 48 41 4e 47 45 5f 44 41 54 ORIAN_CHANGE_DAT
b3a0: 45 5d 0a 20 0a 40 40 20 2d 34 34 38 36 2c 37 20 E]. .@@ -4486,7
b3b0: 2b 34 35 32 33 2c 37 20 40 40 0d 0a 20 20 20 20 +4523,7 @@..
b3c0: 20 7d 0a 20 0a 20 20 20 20 20 69 66 20 7b 20 24 }. . if { $
b3d0: 73 74 61 74 75 73 20 3d 3d 20 31 20 7d 20 7b 0a status == 1 } {.
b3e0: 2d 09 69 66 20 7b 20 5b 6c 69 6e 64 65 78 20 5b -.if { [lindex [
b3f0: 64 69 63 74 20 67 65 74 20 24 6f 70 74 73 20 2d dict get $opts -
b400: 65 72 72 6f 72 63 6f 64 65 5d 20 30 5d 20 65 71 errorcode] 0] eq
b410: 20 7b 43 4c 4f 43 4b 7d 20 7d 20 7b 0a 2b 09 69 {CLOCK} } {.+.i
b420: 66 20 7b 20 5b 6c 69 6e 64 65 78 20 5b 3a 3a 74 f { [lindex [::t
b430: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 6f cl::dict::get $o
b440: 70 74 73 20 2d 65 72 72 6f 72 63 6f 64 65 5d 20 pts -errorcode]
b450: 30 5d 20 65 71 20 7b 43 4c 4f 43 4b 7d 20 7d 20 0] eq {CLOCK} }
b460: 7b 0a 20 09 20 20 20 20 64 69 63 74 20 75 6e 73 {. . dict uns
b470: 65 74 20 6f 70 74 73 20 2d 65 72 72 6f 72 69 6e et opts -errorin
b480: 66 6f 0a 20 09 7d 0a 20 09 72 65 74 75 72 6e 20 fo. .}. .return
b490: 2d 6f 70 74 69 6f 6e 73 20 24 6f 70 74 73 20 24 -options $opts $
b4a0: 72 65 73 75 6c 74 0a 40 40 20 2d 34 35 32 36 2c result.@@ -4526,
b4b0: 31 33 20 2b 34 35 36 33 2c 31 33 20 40 40 0d 0a 13 +4563,13 @@..
b4c0: 20 20 20 20 20 23 20 43 6f 6e 76 65 72 74 20 74 # Convert t
b4d0: 68 65 20 74 69 6d 65 20 74 6f 20 79 65 61 72 2c he time to year,
b4e0: 20 6d 6f 6e 74 68 2c 20 64 61 79 2c 20 61 6e 64 month, day, and
b4f0: 20 66 72 61 63 74 69 6f 6e 20 6f 66 20 64 61 79 fraction of day
b500: 2e 0a 20 0a 20 20 20 20 20 73 65 74 20 64 61 74 .. . set dat
b510: 65 20 5b 47 65 74 44 61 74 65 46 69 65 6c 64 73 e [GetDateFields
b520: 20 24 63 6c 6f 63 6b 76 61 6c 20 24 54 5a 44 61 $clockval $TZDa
b530: 74 61 28 24 74 69 6d 65 7a 6f 6e 65 29 20 24 63 ta($timezone) $c
b540: 68 61 6e 67 65 6f 76 65 72 5d 0a 2d 20 20 20 20 hangeover].-
b550: 64 69 63 74 20 73 65 74 20 64 61 74 65 20 73 65 dict set date se
b560: 63 6f 6e 64 4f 66 44 61 79 20 5b 65 78 70 72 20 condOfDay [expr
b570: 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 { [dict get $dat
b580: 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d 0a e localSeconds].
b590: 2b 20 20 20 20 64 69 63 74 20 73 65 74 20 64 61 + dict set da
b5a0: 74 65 20 73 65 63 6f 6e 64 4f 66 44 61 79 20 5b te secondOfDay [
b5b0: 65 78 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 expr { [::tcl::d
b5c0: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 6c ict::get $date l
b5d0: 6f 63 61 6c 53 65 63 6f 6e 64 73 5d 0a 20 09 09 ocalSeconds]. ..
b5e0: 09 09 20 20 20 20 20 20 25 20 38 36 34 30 30 20 .. % 86400
b5f0: 7d 5d 0a 20 20 20 20 20 64 69 63 74 20 73 65 74 }]. dict set
b600: 20 64 61 74 65 20 74 7a 4e 61 6d 65 20 24 74 69 date tzName $ti
b610: 6d 65 7a 6f 6e 65 0a 20 0a 20 20 20 20 20 23 20 mezone. . #
b620: 41 64 64 20 74 68 65 20 72 65 71 75 69 73 69 74 Add the requisit
b630: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 6f 6e 74 e number of mont
b640: 68 73 0a 20 0a 2d 20 20 20 20 73 65 74 20 6d 20 hs. .- set m
b650: 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20 [dict get $date
b660: 6d 6f 6e 74 68 5d 0a 2b 20 20 20 20 73 65 74 20 month].+ set
b670: 6d 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a m [::tcl::dict::
b680: 67 65 74 20 24 64 61 74 65 20 6d 6f 6e 74 68 5d get $date month]
b690: 0a 20 20 20 20 20 69 6e 63 72 20 6d 20 24 6d 6f . incr m $mo
b6a0: 6e 74 68 73 0a 20 20 20 20 20 69 6e 63 72 20 6d nths. incr m
b6b0: 20 2d 31 0a 20 20 20 20 20 73 65 74 20 64 65 6c -1. set del
b6c0: 74 61 20 5b 65 78 70 72 20 7b 20 24 6d 20 2f 20 ta [expr { $m /
b6d0: 31 32 20 7d 5d 0a 40 40 20 2d 34 35 34 37 2c 37 12 }].@@ -4547,7
b6e0: 20 2b 34 35 38 34 2c 37 20 40 40 0d 0a 20 20 20 +4584,7 @@..
b6f0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 09 73 65 74 } else {. .set
b700: 20 68 61 74 68 20 5b 6c 69 6e 64 65 78 20 24 44 hath [lindex $D
b710: 61 79 73 49 6e 52 6f 6d 61 6e 4d 6f 6e 74 68 49 aysInRomanMonthI
b720: 6e 43 6f 6d 6d 6f 6e 59 65 61 72 20 24 6d 6d 5d nCommonYear $mm]
b730: 0a 20 20 20 20 20 7d 0a 2d 20 20 20 20 69 66 20 . }.- if
b740: 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 { [dict get $dat
b750: 65 20 64 61 79 4f 66 4d 6f 6e 74 68 5d 20 3e 20 e dayOfMonth] >
b760: 24 68 61 74 68 20 7d 20 7b 0a 2b 20 20 20 20 69 $hath } {.+ i
b770: 66 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 f { [::tcl::dict
b780: 3a 3a 67 65 74 20 24 64 61 74 65 20 64 61 79 4f ::get $date dayO
b790: 66 4d 6f 6e 74 68 5d 20 3e 20 24 68 61 74 68 20 fMonth] > $hath
b7a0: 7d 20 7b 0a 20 09 64 69 63 74 20 73 65 74 20 64 } {. .dict set d
b7b0: 61 74 65 20 64 61 79 4f 66 4d 6f 6e 74 68 20 24 ate dayOfMonth $
b7c0: 68 61 74 68 0a 20 20 20 20 20 7d 0a 20 0a 40 40 hath. }. .@@
b7d0: 20 2d 34 35 35 38 2c 31 32 20 2b 34 35 39 35 2c -4558,12 +4595,
b7e0: 31 32 20 40 40 0d 0a 20 09 09 20 20 24 63 68 61 12 @@.. .. $cha
b7f0: 6e 67 65 6f 76 65 72 5d 0a 20 20 20 20 20 64 69 ngeover]. di
b800: 63 74 20 73 65 74 20 64 61 74 65 20 6c 6f 63 61 ct set date loca
b810: 6c 53 65 63 6f 6e 64 73 20 5c 0a 20 09 5b 65 78 lSeconds \. .[ex
b820: 70 72 20 7b 20 2d 32 31 30 38 36 36 38 30 33 32 pr { -2108668032
b830: 30 30 0a 2d 09 09 2b 20 28 20 38 36 34 30 30 20 00.-..+ ( 86400
b840: 2a 20 77 69 64 65 28 5b 64 69 63 74 20 67 65 74 * wide([dict get
b850: 20 24 64 61 74 65 20 6a 75 6c 69 61 6e 44 61 79 $date julianDay
b860: 5d 29 20 29 0a 2d 09 09 2b 20 5b 64 69 63 74 20 ]) ).-..+ [dict
b870: 67 65 74 20 24 64 61 74 65 20 73 65 63 6f 6e 64 get $date second
b880: 4f 66 44 61 79 5d 20 7d 5d 0a 2b 09 09 2b 20 28 OfDay] }].+..+ (
b890: 20 38 36 34 30 30 20 2a 20 77 69 64 65 28 5b 3a 86400 * wide([:
b8a0: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 :tcl::dict::get
b8b0: 24 64 61 74 65 20 6a 75 6c 69 61 6e 44 61 79 5d $date julianDay]
b8c0: 29 20 29 0a 2b 09 09 2b 20 5b 3a 3a 74 63 6c 3a ) ).+..+ [::tcl:
b8d0: 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 :dict::get $date
b8e0: 20 73 65 63 6f 6e 64 4f 66 44 61 79 5d 20 7d 5d secondOfDay] }]
b8f0: 0a 20 20 20 20 20 73 65 74 20 64 61 74 65 20 5b . set date [
b900: 43 6f 6e 76 65 72 74 4c 6f 63 61 6c 54 6f 55 54 ConvertLocalToUT
b910: 43 20 24 64 61 74 65 5b 73 65 74 20 64 61 74 65 C $date[set date
b920: 20 7b 7d 5d 20 24 54 5a 44 61 74 61 28 24 74 69 {}] $TZData($ti
b930: 6d 65 7a 6f 6e 65 29 20 5c 0a 20 09 09 20 24 63 mezone) \. .. $c
b940: 68 61 6e 67 65 6f 76 65 72 5d 0a 20 0a 2d 20 20 hangeover]. .-
b950: 20 20 72 65 74 75 72 6e 20 5b 64 69 63 74 20 67 return [dict g
b960: 65 74 20 24 64 61 74 65 20 73 65 63 6f 6e 64 73 et $date seconds
b970: 5d 0a 2b 20 20 20 20 72 65 74 75 72 6e 20 5b 3a ].+ return [:
b980: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 :tcl::dict::get
b990: 24 64 61 74 65 20 73 65 63 6f 6e 64 73 5d 0a 20 $date seconds].
b9a0: 0a 20 7d 0a 20 0a 40 40 20 2d 34 35 39 37 2c 37 . }. .@@ -4597,7
b9b0: 20 2b 34 36 33 34 2c 37 20 40 40 0d 0a 20 20 20 +4634,7 @@..
b9c0: 20 20 23 20 43 6f 6e 76 65 72 74 20 74 68 65 20 # Convert the
b9d0: 74 69 6d 65 20 74 6f 20 4a 75 6c 69 61 6e 20 44 time to Julian D
b9e0: 61 79 0a 20 0a 20 20 20 20 20 73 65 74 20 64 61 ay. . set da
b9f0: 74 65 20 5b 47 65 74 44 61 74 65 46 69 65 6c 64 te [GetDateField
ba00: 73 20 24 63 6c 6f 63 6b 76 61 6c 20 24 54 5a 44 s $clockval $TZD
ba10: 61 74 61 28 24 74 69 6d 65 7a 6f 6e 65 29 20 24 ata($timezone) $
ba20: 63 68 61 6e 67 65 6f 76 65 72 5d 0a 2d 20 20 20 changeover].-
ba30: 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20 73 dict set date s
ba40: 65 63 6f 6e 64 4f 66 44 61 79 20 5b 65 78 70 72 econdOfDay [expr
ba50: 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 { [dict get $da
ba60: 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d te localSeconds]
ba70: 0a 2b 20 20 20 20 64 69 63 74 20 73 65 74 20 64 .+ dict set d
ba80: 61 74 65 20 73 65 63 6f 6e 64 4f 66 44 61 79 20 ate secondOfDay
ba90: 5b 65 78 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a 3a [expr { [::tcl::
baa0: 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 dict::get $date
bab0: 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d 0a 20 09 localSeconds]. .
bac0: 09 09 09 20 20 20 20 20 20 25 20 38 36 34 30 30 ... % 86400
bad0: 20 7d 5d 0a 20 20 20 20 20 64 69 63 74 20 73 65 }]. dict se
bae0: 74 20 64 61 74 65 20 74 7a 4e 61 6d 65 20 24 74 t date tzName $t
baf0: 69 6d 65 7a 6f 6e 65 0a 20 0a 40 40 20 2d 34 36 imezone. .@@ -46
bb00: 30 39 2c 31 32 20 2b 34 36 34 36 2c 31 32 20 40 09,12 +4646,12 @
bb10: 40 0d 0a 20 0a 20 20 20 20 20 64 69 63 74 20 73 @.. . dict s
bb20: 65 74 20 64 61 74 65 20 6c 6f 63 61 6c 53 65 63 et date localSec
bb30: 6f 6e 64 73 20 5c 0a 20 09 5b 65 78 70 72 20 7b onds \. .[expr {
bb40: 20 2d 32 31 30 38 36 36 38 30 33 32 30 30 0a 2d -210866803200.-
bb50: 09 09 2b 20 28 20 38 36 34 30 30 20 2a 20 77 69 ..+ ( 86400 * wi
bb60: 64 65 28 5b 64 69 63 74 20 67 65 74 20 24 64 61 de([dict get $da
bb70: 74 65 20 6a 75 6c 69 61 6e 44 61 79 5d 29 20 29 te julianDay]) )
bb80: 0a 2d 09 09 2b 20 5b 64 69 63 74 20 67 65 74 20 .-..+ [dict get
bb90: 24 64 61 74 65 20 73 65 63 6f 6e 64 4f 66 44 61 $date secondOfDa
bba0: 79 5d 20 7d 5d 0a 2b 09 09 2b 20 28 20 38 36 34 y] }].+..+ ( 864
bbb0: 30 30 20 2a 20 77 69 64 65 28 5b 3a 3a 74 63 6c 00 * wide([::tcl
bbc0: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 ::dict::get $dat
bbd0: 65 20 6a 75 6c 69 61 6e 44 61 79 5d 29 20 29 0a e julianDay]) ).
bbe0: 2b 09 09 2b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 +..+ [::tcl::dic
bbf0: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 73 65 63 t::get $date sec
bc00: 6f 6e 64 4f 66 44 61 79 5d 20 7d 5d 0a 20 20 20 ondOfDay] }].
bc10: 20 20 73 65 74 20 64 61 74 65 20 5b 43 6f 6e 76 set date [Conv
bc20: 65 72 74 4c 6f 63 61 6c 54 6f 55 54 43 20 24 64 ertLocalToUTC $d
bc30: 61 74 65 5b 73 65 74 20 64 61 74 65 20 7b 7d 5d ate[set date {}]
bc40: 20 24 54 5a 44 61 74 61 28 24 74 69 6d 65 7a 6f $TZData($timezo
bc50: 6e 65 29 20 5c 0a 20 09 09 20 20 24 63 68 61 6e ne) \. .. $chan
bc60: 67 65 6f 76 65 72 5d 0a 20 0a 2d 20 20 20 20 72 geover]. .- r
bc70: 65 74 75 72 6e 20 5b 64 69 63 74 20 67 65 74 20 eturn [dict get
bc80: 24 64 61 74 65 20 73 65 63 6f 6e 64 73 5d 0a 2b $date seconds].+
bc90: 20 20 20 20 72 65 74 75 72 6e 20 5b 3a 3a 74 63 return [::tc
bca0: 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 l::dict::get $da
bcb0: 74 65 20 73 65 63 6f 6e 64 73 5d 0a 20 0a 20 7d te seconds]. . }
bcc0: 0a 20 0a 40 40 20 2d 34 36 34 32 2c 38 20 2b 34 . .@@ -4642,8 +4
bcd0: 36 37 39 2c 38 20 40 40 0d 0a 20 70 72 6f 63 20 679,8 @@.. proc
bce0: 3a 3a 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 6d 63 ::tcl::clock::mc
bcf0: 20 7b 20 6e 61 6d 65 20 7d 20 7b 0a 20 20 20 20 { name } {.
bd00: 20 76 61 72 69 61 62 6c 65 20 4d 63 4c 6f 61 64 variable McLoad
bd10: 65 64 0a 20 20 20 20 20 73 65 74 20 4c 6f 63 61 ed. set Loca
bd20: 6c 65 20 5b 6d 63 6c 6f 63 61 6c 65 5d 0a 2d 20 le [mclocale].-
bd30: 20 20 20 69 66 20 7b 20 5b 64 69 63 74 20 65 78 if { [dict ex
bd40: 69 73 74 73 20 24 4d 63 4c 6f 61 64 65 64 20 24 ists $McLoaded $
bd50: 4c 6f 63 61 6c 65 20 24 6e 61 6d 65 5d 20 7d 20 Locale $name] }
bd60: 7b 0a 2d 09 72 65 74 75 72 6e 20 5b 64 69 63 74 {.-.return [dict
bd70: 20 67 65 74 20 24 4d 63 4c 6f 61 64 65 64 20 24 get $McLoaded $
bd80: 4c 6f 63 61 6c 65 20 24 6e 61 6d 65 5d 0a 2b 20 Locale $name].+
bd90: 20 20 20 69 66 20 7b 20 5b 3a 3a 74 63 6c 3a 3a if { [::tcl::
bda0: 64 69 63 74 3a 3a 65 78 69 73 74 73 20 24 4d 63 dict::exists $Mc
bdb0: 4c 6f 61 64 65 64 20 24 4c 6f 63 61 6c 65 20 24 Loaded $Locale $
bdc0: 6e 61 6d 65 5d 20 7d 20 7b 0a 2b 09 72 65 74 75 name] } {.+.retu
bdd0: 72 6e 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a rn [::tcl::dict:
bde0: 3a 67 65 74 20 24 4d 63 4c 6f 61 64 65 64 20 24 :get $McLoaded $
bdf0: 4c 6f 63 61 6c 65 20 24 6e 61 6d 65 5d 0a 20 20 Locale $name].
be00: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 09 73 65 } else {. .se
be10: 74 20 76 61 6c 20 5b 3a 3a 6d 73 67 63 61 74 3a t val [::msgcat:
be20: 3a 6d 63 20 24 6e 61 6d 65 5d 0a 20 09 64 69 63 :mc $name]. .dic
be30: 74 20 73 65 74 20 4d 63 4c 6f 61 64 65 64 20 24 t set McLoaded $
be40: 4c 6f 63 61 6c 65 20 24 6e 61 6d 65 20 24 76 61 Locale $name $va
be50: 6c 0a 40 40 20 2d 34 36 37 31 2c 36 20 2b 34 37 l.@@ -4671,6 +47
be60: 30 38 2c 37 20 40 40 0d 0a 20 70 72 6f 63 20 3a 08,7 @@.. proc :
be70: 3a 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 43 6c 65 :tcl::clock::Cle
be80: 61 72 43 61 63 68 65 73 20 7b 7d 20 7b 0a 20 0a arCaches {} {. .
be90: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 46 6f variable Fo
bea0: 72 6d 61 74 50 72 6f 63 0a 2b 20 20 20 20 76 61 rmatProc.+ va
beb0: 72 69 61 62 6c 65 20 53 63 61 6e 50 72 6f 63 0a riable ScanProc.
bec0: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 4c 6f variable Lo
bed0: 63 61 6c 65 4e 75 6d 65 72 61 6c 43 61 63 68 65 caleNumeralCache
bee0: 0a 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 4d . variable M
bef0: 63 4c 6f 61 64 65 64 0a 20 20 20 20 20 76 61 72 cLoaded. var
bf00: 69 61 62 6c 65 20 43 61 63 68 65 64 53 79 73 74 iable CachedSyst
bf10: 65 6d 54 69 6d 65 5a 6f 6e 65 0a 40 40 20 2d 34 emTimeZone.@@ -4
bf20: 36 38 34 2c 36 20 2b 34 37 32 32 2c 37 20 40 40 684,6 +4722,7 @@
bf30: 0d 0a 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 .. }. .
bf40: 63 61 74 63 68 20 7b 75 6e 73 65 74 20 46 6f 72 catch {unset For
bf50: 6d 61 74 50 72 6f 63 7d 0a 2b 20 20 20 20 63 61 matProc}.+ ca
bf60: 74 63 68 20 7b 75 6e 73 65 74 20 53 63 61 6e 50 tch {unset ScanP
bf70: 72 6f 63 7d 0a 20 20 20 20 20 73 65 74 20 4c 6f roc}. set Lo
bf80: 63 61 6c 65 4e 75 6d 65 72 61 6c 43 61 63 68 65 caleNumeralCache
bf90: 20 7b 7d 0a 20 20 20 20 20 73 65 74 20 4d 63 4c {}. set McL
bfa0: 6f 61 64 65 64 20 7b 7d 0a 20 20 20 20 20 63 61 oaded {}. ca
bfb0: 74 63 68 20 7b 75 6e 73 65 74 20 43 61 63 68 65 tch {unset Cache
bfc0: 64 53 79 73 74 65 6d 54 69 6d 65 5a 6f 6e 65 7d dSystemTimeZone}
bfd0: 0a 40 40 20 2d 34 36 39 31 2c 33 20 2b 34 37 33 .@@ -4691,3 +473
bfe0: 30 2c 32 30 39 20 40 40 0d 0a 20 20 20 20 20 49 0,209 @@.. I
bff0: 6e 69 74 54 5a 44 61 74 61 0a 20 0a 20 7d 0a 2b nitTZData. . }.+
c000: 0a 2b 0a 2b 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .+.+#-----------
c010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 23 20 5b -----------.+# [
c050: 53 42 5d 20 65 78 74 65 6e 73 69 6f 6e 3a 0a 2b SB] extension:.+
c060: 23 20 20 20 2d 20 76 61 6c 69 64 61 74 65 20 3a # - validate :
c070: 0a 2b 23 20 20 20 2d 20 63 72 65 61 74 65 20 64 .+# - create d
c080: 61 74 65 20 64 69 72 65 63 74 20 66 72 6f 6d 20 ate direct from
c090: 61 72 67 73 20 28 77 69 74 68 6f 75 74 20 70 61 args (without pa
c0a0: 72 73 69 6e 67 20 73 74 72 69 6e 67 29 20 3a 0a rsing string) :.
c0b0: 2b 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d +#--------------
c0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c0f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 0a 2b 70 72 6f 63 --------.+.+proc
c100: 20 3a 3a 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 56 ::tcl::clock::V
c110: 61 6c 69 64 44 61 74 65 20 7b 64 61 74 65 20 73 alidDate {date s
c120: 74 72 69 6e 67 7d 20 7b 0a 2b 20 20 23 23 20 63 tring} {.+ ## c
c130: 68 65 63 6b 20 64 61 74 65 20 3a 0a 2b 20 20 69 heck date :.+ i
c140: 66 20 7b 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a f {[::tcl::dict:
c150: 3a 65 78 69 73 74 73 20 24 64 61 74 65 20 6d 6f :exists $date mo
c160: 6e 74 68 5d 20 26 26 20 5b 3a 3a 74 63 6c 3a 3a nth] && [::tcl::
c170: 64 69 63 74 3a 3a 65 78 69 73 74 73 20 24 64 61 dict::exists $da
c180: 74 65 20 64 61 79 4f 66 4d 6f 6e 74 68 5d 7d 20 te dayOfMonth]}
c190: 7b 0a 2b 20 20 20 20 23 23 20 66 69 72 73 74 20 {.+ ## first
c1a0: 2d 20 6d 6f 6e 74 68 20 3a 0a 2b 20 20 20 20 69 - month :.+ i
c1b0: 66 20 7b 20 5b 73 65 74 20 6d 6f 6e 74 68 20 5b f { [set month [
c1c0: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 ::tcl::dict::get
c1d0: 20 24 64 61 74 65 20 6d 6f 6e 74 68 5d 5d 20 3e $date month]] >
c1e0: 20 31 32 20 7c 7c 20 24 6d 6f 6e 74 68 20 3c 20 12 || $month <
c1f0: 31 20 7d 20 7b 0a 2b 20 20 20 20 20 20 72 65 74 1 } {.+ ret
c200: 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 urn -code error
c210: 2d 65 72 72 6f 72 63 6f 64 65 20 5b 6c 69 73 74 -errorcode [list
c220: 20 43 4c 4f 43 4b 20 69 6e 76 61 6c 69 64 41 72 CLOCK invalidAr
c230: 67 73 5d 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 gs] "unable to c
c240: 6f 6e 76 65 72 74 20 64 61 74 65 2d 74 69 6d 65 onvert date-time
c250: 20 73 74 72 69 6e 67 20 5c 22 24 73 74 72 69 6e string \"$strin
c260: 67 5c 22 3a 20 69 6e 76 61 6c 69 64 20 6d 6f 6e g\": invalid mon
c270: 74 68 22 0a 2b 20 20 20 20 7d 0a 2b 20 20 20 20 th".+ }.+
c280: 23 23 20 62 79 20 66 65 62 72 75 61 72 79 20 63 ## by february c
c290: 68 65 63 6b 20 6c 65 61 70 20 79 65 61 72 20 3a heck leap year :
c2a0: 0a 2b 20 20 20 20 69 66 20 7b 5b 73 65 74 20 64 .+ if {[set d
c2b0: 61 79 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a ay [::tcl::dict:
c2c0: 3a 67 65 74 20 24 64 61 74 65 20 64 61 79 4f 66 :get $date dayOf
c2d0: 4d 6f 6e 74 68 5d 5d 20 3c 20 31 7d 20 7b 0a 2b Month]] < 1} {.+
c2e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f return -co
c2f0: 64 65 20 65 72 72 6f 72 20 2d 65 72 72 6f 72 63 de error -errorc
c300: 6f 64 65 20 5b 6c 69 73 74 20 43 4c 4f 43 4b 20 ode [list CLOCK
c310: 69 6e 76 61 6c 69 64 41 72 67 73 5d 20 22 75 6e invalidArgs] "un
c320: 61 62 6c 65 20 74 6f 20 63 6f 6e 76 65 72 74 20 able to convert
c330: 64 61 74 65 2d 74 69 6d 65 20 73 74 72 69 6e 67 date-time string
c340: 20 5c 22 24 73 74 72 69 6e 67 5c 22 3a 20 69 6e \"$string\": in
c350: 76 61 6c 69 64 20 64 61 79 22 0a 2b 20 20 20 20 valid day".+
c360: 7d 0a 2b 20 20 20 20 69 66 20 7b 24 64 61 79 20 }.+ if {$day
c370: 3e 20 32 38 7d 20 7b 0a 2b 20 20 20 20 20 20 69 > 28} {.+ i
c380: 66 20 7b 24 6d 6f 6e 74 68 20 3d 3d 20 32 7d 20 f {$month == 2}
c390: 7b 0a 2b 20 20 20 20 20 20 20 20 69 66 20 7b 5b {.+ if {[
c3a0: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 ::tcl::dict::exi
c3b0: 73 74 73 20 24 64 61 74 65 20 67 72 65 67 6f 72 sts $date gregor
c3c0: 69 61 6e 5d 7d 20 7b 0a 2b 20 20 20 20 20 20 20 ian]} {.+
c3d0: 20 20 20 69 66 20 7b 20 5b 49 73 47 72 65 67 6f if { [IsGrego
c3e0: 72 69 61 6e 4c 65 61 70 59 65 61 72 20 24 64 61 rianLeapYear $da
c3f0: 74 65 5d 20 7d 20 7b 0a 2b 20 20 20 20 20 20 20 te] } {.+
c400: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 44 61 variable Da
c410: 79 73 49 6e 52 6f 6d 61 6e 4d 6f 6e 74 68 49 6e ysInRomanMonthIn
c420: 4c 65 61 70 59 65 61 72 0a 2b 20 20 20 20 20 20 LeapYear.+
c430: 20 20 20 20 20 20 73 65 74 20 68 61 74 68 20 5b set hath [
c440: 6c 69 6e 64 65 78 20 24 44 61 79 73 49 6e 52 6f lindex $DaysInRo
c450: 6d 61 6e 4d 6f 6e 74 68 49 6e 4c 65 61 70 59 65 manMonthInLeapYe
c460: 61 72 20 5b 65 78 70 72 20 7b 24 6d 6f 6e 74 68 ar [expr {$month
c470: 20 2d 20 31 7d 5d 5d 0a 2b 20 20 20 20 20 20 20 - 1}]].+
c480: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 2b 20 20 20 } else {.+
c490: 20 20 20 20 20 20 20 20 20 76 61 72 69 61 62 6c variabl
c4a0: 65 20 44 61 79 73 49 6e 52 6f 6d 61 6e 4d 6f 6e e DaysInRomanMon
c4b0: 74 68 49 6e 43 6f 6d 6d 6f 6e 59 65 61 72 0a 2b thInCommonYear.+
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 set
c4d0: 68 61 74 68 20 5b 6c 69 6e 64 65 78 20 24 44 61 hath [lindex $Da
c4e0: 79 73 49 6e 52 6f 6d 61 6e 4d 6f 6e 74 68 49 6e ysInRomanMonthIn
c4f0: 43 6f 6d 6d 6f 6e 59 65 61 72 20 5b 65 78 70 72 CommonYear [expr
c500: 20 7b 24 6d 6f 6e 74 68 20 2d 20 31 7d 5d 5d 0a {$month - 1}]].
c510: 2b 20 20 20 20 20 20 20 20 20 20 7d 0a 2b 20 20 + }.+
c520: 20 20 20 20 20 20 7d 0a 2b 20 20 20 20 20 20 7d }.+ }
c530: 20 65 6c 73 65 20 7b 0a 2b 20 20 20 20 20 20 20 else {.+
c540: 20 76 61 72 69 61 62 6c 65 20 44 61 79 73 49 6e variable DaysIn
c550: 52 6f 6d 61 6e 4d 6f 6e 74 68 49 6e 43 6f 6d 6d RomanMonthInComm
c560: 6f 6e 59 65 61 72 0a 2b 20 20 20 20 20 20 20 20 onYear.+
c570: 73 65 74 20 68 61 74 68 20 5b 6c 69 6e 64 65 78 set hath [lindex
c580: 20 24 44 61 79 73 49 6e 52 6f 6d 61 6e 4d 6f 6e $DaysInRomanMon
c590: 74 68 49 6e 43 6f 6d 6d 6f 6e 59 65 61 72 20 5b thInCommonYear [
c5a0: 65 78 70 72 20 7b 24 6d 6f 6e 74 68 20 2d 20 31 expr {$month - 1
c5b0: 7d 5d 5d 0a 2b 20 20 20 20 20 20 7d 0a 2b 20 20 }]].+ }.+
c5c0: 20 20 20 20 23 23 20 63 68 65 63 6b 20 64 61 79 ## check day
c5d0: 20 69 6e 20 6d 6f 6e 74 68 20 3a 0a 2b 20 20 20 in month :.+
c5e0: 20 20 20 69 66 20 7b 20 24 64 61 79 20 3e 20 24 if { $day > $
c5f0: 68 61 74 68 20 7d 20 7b 0a 2b 20 20 20 20 20 20 hath } {.+
c600: 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 return -code e
c610: 72 72 6f 72 20 2d 65 72 72 6f 72 63 6f 64 65 20 rror -errorcode
c620: 5b 6c 69 73 74 20 43 4c 4f 43 4b 20 69 6e 76 61 [list CLOCK inva
c630: 6c 69 64 41 72 67 73 5d 20 22 75 6e 61 62 6c 65 lidArgs] "unable
c640: 20 74 6f 20 63 6f 6e 76 65 72 74 20 64 61 74 65 to convert date
c650: 2d 74 69 6d 65 20 73 74 72 69 6e 67 20 5c 22 24 -time string \"$
c660: 73 74 72 69 6e 67 5c 22 3a 20 69 6e 76 61 6c 69 string\": invali
c670: 64 20 64 61 79 22 0a 2b 20 20 20 20 20 20 7d 0a d day".+ }.
c680: 2b 20 20 20 20 7d 0a 2b 20 20 7d 0a 2b 20 20 23 + }.+ }.+ #
c690: 23 20 4f 6c 64 73 63 61 6e 20 63 6f 75 6c 64 20 # Oldscan could
c6a0: 72 65 74 75 72 6e 73 20 73 65 63 6f 6e 64 4f 66 returns secondOf
c6b0: 44 61 79 20 28 70 61 72 73 65 64 54 69 6d 65 29 Day (parsedTime)
c6c0: 20 2d 31 20 62 79 20 69 6e 76 61 6c 69 64 20 74 -1 by invalid t
c6d0: 69 6d 65 20 28 65 78 2e 3a 20 32 35 3a 30 30 3a ime (ex.: 25:00:
c6e0: 30 30 29 20 3a 0a 2b 20 20 69 66 20 7b 5b 3a 3a 00) :.+ if {[::
c6f0: 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 73 74 tcl::dict::exist
c700: 73 20 24 64 61 74 65 20 73 65 63 6f 6e 64 4f 66 s $date secondOf
c710: 44 61 79 5d 20 26 26 20 5b 3a 3a 74 63 6c 3a 3a Day] && [::tcl::
c720: 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 dict::get $date
c730: 73 65 63 6f 6e 64 4f 66 44 61 79 5d 20 3d 3d 20 secondOfDay] ==
c740: 2d 31 7d 20 7b 0a 2b 20 20 20 20 72 65 74 75 72 -1} {.+ retur
c750: 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 2d 65 n -code error -e
c760: 72 72 6f 72 63 6f 64 65 20 5b 6c 69 73 74 20 43 rrorcode [list C
c770: 4c 4f 43 4b 20 69 6e 76 61 6c 69 64 41 72 67 73 LOCK invalidArgs
c780: 5d 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6e ] "unable to con
c790: 76 65 72 74 20 64 61 74 65 2d 74 69 6d 65 20 73 vert date-time s
c7a0: 74 72 69 6e 67 20 5c 22 24 73 74 72 69 6e 67 5c tring \"$string\
c7b0: 22 3a 20 69 6e 76 61 6c 69 64 20 74 69 6d 65 22 ": invalid time"
c7c0: 0a 2b 20 20 7d 0a 2b 20 20 23 23 20 63 68 65 63 .+ }.+ ## chec
c7d0: 6b 20 74 69 6d 65 20 28 30 30 3a 30 30 3a 30 30 k time (00:00:00
c7e0: 20 2d 20 32 33 3a 35 39 3a 35 39 20 6f 72 20 30 - 23:59:59 or 0
c7f0: 30 3a 30 30 3a 30 30 5b 61 70 5d 6d 20 2d 20 31 0:00:00[ap]m - 1
c800: 32 3a 30 30 3a 30 30 5b 61 70 5d 6d 29 20 3a 0a 2:00:00[ap]m) :.
c810: 2b 20 20 69 66 20 7b 5b 3a 3a 74 63 6c 3a 3a 64 + if {[::tcl::d
c820: 69 63 74 3a 3a 65 78 69 73 74 73 20 24 64 61 74 ict::exists $dat
c830: 65 20 68 6f 75 72 5d 7d 20 7b 0a 2b 20 20 20 20 e hour]} {.+
c840: 69 66 20 7b 5b 73 65 74 20 76 20 5b 3a 3a 74 63 if {[set v [::tc
c850: 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 l::dict::get $da
c860: 74 65 20 68 6f 75 72 5d 5d 20 3c 20 30 20 7c 7c te hour]] < 0 ||
c870: 20 24 76 20 3e 20 32 33 7d 20 7b 0a 2b 20 20 20 $v > 23} {.+
c880: 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 return -code
c890: 65 72 72 6f 72 20 2d 65 72 72 6f 72 63 6f 64 65 error -errorcode
c8a0: 20 5b 6c 69 73 74 20 43 4c 4f 43 4b 20 69 6e 76 [list CLOCK inv
c8b0: 61 6c 69 64 41 72 67 73 5d 20 22 75 6e 61 62 6c alidArgs] "unabl
c8c0: 65 20 74 6f 20 63 6f 6e 76 65 72 74 20 64 61 74 e to convert dat
c8d0: 65 2d 74 69 6d 65 20 73 74 72 69 6e 67 20 5c 22 e-time string \"
c8e0: 24 73 74 72 69 6e 67 5c 22 3a 20 69 6e 76 61 6c $string\": inval
c8f0: 69 64 20 74 69 6d 65 20 28 68 6f 75 72 29 22 0a id time (hour)".
c900: 2b 20 20 20 20 7d 0a 2b 20 20 20 20 69 66 20 7b + }.+ if {
c910: 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 [::tcl::dict::ex
c920: 69 73 74 73 20 24 64 61 74 65 20 61 6d 50 6d 49 ists $date amPmI
c930: 6e 64 69 63 61 74 6f 72 5d 20 26 26 20 24 76 20 ndicator] && $v
c940: 3e 20 31 32 7d 20 7b 0a 2b 20 20 20 20 20 20 72 > 12} {.+ r
c950: 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f eturn -code erro
c960: 72 20 2d 65 72 72 6f 72 63 6f 64 65 20 5b 6c 69 r -errorcode [li
c970: 73 74 20 43 4c 4f 43 4b 20 69 6e 76 61 6c 69 64 st CLOCK invalid
c980: 41 72 67 73 5d 20 22 75 6e 61 62 6c 65 20 74 6f Args] "unable to
c990: 20 63 6f 6e 76 65 72 74 20 64 61 74 65 2d 74 69 convert date-ti
c9a0: 6d 65 20 73 74 72 69 6e 67 20 5c 22 24 73 74 72 me string \"$str
c9b0: 69 6e 67 5c 22 3a 20 69 6e 76 61 6c 69 64 20 74 ing\": invalid t
c9c0: 69 6d 65 20 28 68 6f 75 72 2f 61 6d 3a 70 6d 29 ime (hour/am:pm)
c9d0: 22 0a 2b 20 20 20 20 7d 0a 2b 20 20 7d 0a 2b 20 ".+ }.+ }.+
c9e0: 20 69 66 20 7b 5b 3a 3a 74 63 6c 3a 3a 64 69 63 if {[::tcl::dic
c9f0: 74 3a 3a 65 78 69 73 74 73 20 24 64 61 74 65 20 t::exists $date
ca00: 6d 69 6e 75 74 65 5d 20 26 26 20 28 5b 73 65 74 minute] && ([set
ca10: 20 76 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a v [::tcl::dict:
ca20: 3a 67 65 74 20 24 64 61 74 65 20 6d 69 6e 75 74 :get $date minut
ca30: 65 5d 5d 20 3c 20 30 20 7c 7c 20 24 76 20 3e 20 e]] < 0 || $v >
ca40: 35 39 29 7d 20 7b 0a 2b 20 20 20 20 72 65 74 75 59)} {.+ retu
ca50: 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 2d rn -code error -
ca60: 65 72 72 6f 72 63 6f 64 65 20 5b 6c 69 73 74 20 errorcode [list
ca70: 43 4c 4f 43 4b 20 69 6e 76 61 6c 69 64 41 72 67 CLOCK invalidArg
ca80: 73 5d 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6f s] "unable to co
ca90: 6e 76 65 72 74 20 64 61 74 65 2d 74 69 6d 65 20 nvert date-time
caa0: 73 74 72 69 6e 67 20 5c 22 24 73 74 72 69 6e 67 string \"$string
cab0: 5c 22 3a 20 69 6e 76 61 6c 69 64 20 74 69 6d 65 \": invalid time
cac0: 20 28 6d 69 6e 75 74 65 29 22 0a 2b 20 20 7d 0a (minute)".+ }.
cad0: 2b 20 20 69 66 20 7b 5b 3a 3a 74 63 6c 3a 3a 64 + if {[::tcl::d
cae0: 69 63 74 3a 3a 65 78 69 73 74 73 20 24 64 61 74 ict::exists $dat
caf0: 65 20 73 65 63 6f 6e 64 5d 20 26 26 20 28 5b 73 e second] && ([s
cb00: 65 74 20 76 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 et v [::tcl::dic
cb10: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 73 65 63 t::get $date sec
cb20: 6f 6e 64 5d 5d 20 3c 20 30 20 7c 7c 20 24 76 20 ond]] < 0 || $v
cb30: 3e 20 35 39 29 7d 20 7b 0a 2b 20 20 20 20 72 65 > 59)} {.+ re
cb40: 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 turn -code error
cb50: 20 2d 65 72 72 6f 72 63 6f 64 65 20 5b 6c 69 73 -errorcode [lis
cb60: 74 20 43 4c 4f 43 4b 20 69 6e 76 61 6c 69 64 41 t CLOCK invalidA
cb70: 72 67 73 5d 20 22 75 6e 61 62 6c 65 20 74 6f 20 rgs] "unable to
cb80: 63 6f 6e 76 65 72 74 20 64 61 74 65 2d 74 69 6d convert date-tim
cb90: 65 20 73 74 72 69 6e 67 20 5c 22 24 73 74 72 69 e string \"$stri
cba0: 6e 67 5c 22 3a 20 69 6e 76 61 6c 69 64 20 74 69 ng\": invalid ti
cbb0: 6d 65 20 28 73 65 63 6f 6e 64 29 22 0a 2b 20 20 me (second)".+
cbc0: 7d 0a 2b 7d 0a 2b 0a 2b 23 2d 2d 2d 2d 2d 2d 2d }.+}.+.+#-------
cbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
cc10: 2b 0a 2b 70 72 6f 63 20 3a 3a 74 63 6c 3a 3a 63 +.+proc ::tcl::c
cc20: 6c 6f 63 6b 3a 3a 4d 61 6b 65 44 61 74 65 20 7b lock::MakeDate {
cc30: 61 72 67 73 7d 20 7b 0a 2b 09 73 65 74 20 64 61 args} {.+.set da
cc40: 74 65 20 24 61 72 67 73 5b 73 65 74 20 61 72 67 te $args[set arg
cc50: 73 20 7b 7d 5d 0a 2b 09 0a 2b 09 69 66 20 7b 21 s {}].+..+.if {!
cc60: 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 [::tcl::dict::ex
cc70: 69 73 74 73 20 24 64 61 74 65 20 62 61 73 65 54 ists $date baseT
cc80: 69 6d 65 5d 7d 20 7b 0a 2b 09 09 73 65 74 20 62 ime]} {.+..set b
cc90: 61 73 65 54 69 6d 65 20 5b 63 6c 6f 63 6b 20 73 aseTime [clock s
cca0: 65 63 6f 6e 64 73 5d 0a 2b 09 7d 20 65 6c 73 65 econds].+.} else
ccb0: 20 7b 0a 2b 09 09 73 65 74 20 62 61 73 65 54 69 {.+..set baseTi
ccc0: 6d 65 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a me [::tcl::dict:
ccd0: 3a 67 65 74 20 24 64 61 74 65 20 62 61 73 65 54 :get $date baseT
cce0: 69 6d 65 5d 0a 2b 09 7d 0a 2b 0a 2b 09 73 65 74 ime].+.}.+.+.set
ccf0: 20 63 68 61 6e 67 65 6f 76 65 72 20 32 33 36 31 changeover 2361
cd00: 32 32 32 3b 20 23 5b 74 63 6c 3a 3a 63 6c 6f 63 222; #[tcl::cloc
cd10: 6b 3a 3a 6d 63 20 47 52 45 47 4f 52 49 41 4e 5f k::mc GREGORIAN_
cd20: 43 48 41 4e 47 45 5f 44 41 54 45 5d 0a 2b 09 73 CHANGE_DATE].+.s
cd30: 65 74 20 74 7a 20 7b 7d 0a 2b 09 69 66 20 7b 5b et tz {}.+.if {[
cd40: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 ::tcl::dict::exi
cd50: 73 74 73 20 24 64 61 74 65 20 74 7a 4e 61 6d 65 sts $date tzName
cd60: 5d 7d 20 7b 0a 2b 09 09 73 65 74 20 74 7a 20 5b ]} {.+..set tz [
cd70: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 ::tcl::dict::get
cd80: 20 24 64 61 74 65 20 74 7a 4e 61 6d 65 5d 0a 2b $date tzName].+
cd90: 09 09 69 66 20 7b 24 74 7a 20 3d 3d 20 7b 7d 7d ..if {$tz == {}}
cda0: 20 7b 0a 2b 09 09 09 73 65 74 20 74 7a 20 5b 3a {.+...set tz [:
cdb0: 3a 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 47 65 74 :tcl::clock::Get
cdc0: 53 79 73 74 65 6d 54 69 6d 65 5a 6f 6e 65 5d 0a SystemTimeZone].
cdd0: 2b 09 09 7d 20 65 6c 73 65 69 66 20 7b 24 74 7a +..} elseif {$tz
cde0: 20 69 6e 20 7b 3a 55 54 43 20 3a 47 4d 54 7d 7d in {:UTC :GMT}}
cdf0: 20 7b 0a 2b 09 09 09 73 65 74 20 74 7a 20 7b 7d {.+...set tz {}
ce00: 0a 2b 09 09 7d 0a 2b 09 09 69 66 20 7b 24 74 7a .+..}.+..if {$tz
ce10: 20 21 3d 20 7b 7d 7d 20 7b 0a 2b 09 09 09 76 61 != {}} {.+...va
ce20: 72 69 61 62 6c 65 20 54 5a 44 61 74 61 0a 2b 09 riable TZData.+.
ce30: 09 09 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 ..if {![info exi
ce40: 73 74 73 20 54 5a 44 61 74 61 28 24 74 7a 29 5d sts TZData($tz)]
ce50: 7d 20 7b 0a 2b 09 09 09 09 3a 3a 74 63 6c 3a 3a } {.+....::tcl::
ce60: 63 6c 6f 63 6b 3a 3a 53 65 74 75 70 54 69 6d 65 clock::SetupTime
ce70: 5a 6f 6e 65 20 24 74 7a 0a 2b 09 09 09 7d 0a 2b Zone $tz.+...}.+
ce80: 09 09 7d 0a 2b 09 7d 0a 2b 0a 2b 09 64 69 63 74 ..}.+.}.+.+.dict
ce90: 20 73 65 74 20 64 61 74 65 20 65 72 61 20 43 45 set date era CE
cea0: 0a 2b 09 23 20 4a 75 6c 69 61 6e 20 44 61 79 20 .+.# Julian Day
ceb0: 4e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20 Number from the
cec0: 66 69 65 6c 64 73 2e 0a 2b 09 69 66 20 7b 21 5b fields..+.if {![
ced0: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 ::tcl::dict::exi
cee0: 73 74 73 20 24 64 61 74 65 20 79 65 61 72 5d 7d sts $date year]}
cef0: 20 7b 0a 2b 09 09 69 66 20 7b 21 5b 3a 3a 74 63 {.+..if {![::tc
cf00: 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 73 74 73 20 l::dict::exists
cf10: 24 64 61 74 65 20 79 65 61 72 4f 66 43 65 6e 74 $date yearOfCent
cf20: 75 72 79 5d 7d 20 7b 0a 2b 09 09 09 73 65 74 20 ury]} {.+...set
cf30: 64 61 74 65 20 5b 41 73 73 69 67 6e 42 61 73 65 date [AssignBase
cf40: 59 65 61 72 20 24 64 61 74 65 5b 73 65 74 20 64 Year $date[set d
cf50: 61 74 65 20 7b 7d 5d 20 5c 0a 2b 09 09 09 09 24 ate {}] \.+....$
cf60: 62 61 73 65 54 69 6d 65 20 24 74 7a 20 24 63 68 baseTime $tz $ch
cf70: 61 6e 67 65 6f 76 65 72 5d 0a 2b 09 09 7d 20 65 angeover].+..} e
cf80: 6c 73 65 20 7b 0a 2b 09 09 09 73 65 74 20 64 61 lse {.+...set da
cf90: 74 65 20 5b 49 6e 74 65 72 70 72 65 74 54 77 6f te [InterpretTwo
cfa0: 44 69 67 69 74 59 65 61 72 20 24 64 61 74 65 5b DigitYear $date[
cfb0: 73 65 74 20 64 61 74 65 20 7b 7d 5d 20 24 62 61 set date {}] $ba
cfc0: 73 65 54 69 6d 65 5d 0a 2b 09 09 7d 0a 2b 09 7d seTime].+..}.+.}
cfd0: 0a 2b 09 69 66 20 7b 21 5b 3a 3a 74 63 6c 3a 3a .+.if {![::tcl::
cfe0: 64 69 63 74 3a 3a 65 78 69 73 74 73 20 24 64 61 dict::exists $da
cff0: 74 65 20 6d 6f 6e 74 68 5d 7d 20 7b 0a 2b 09 09 te month]} {.+..
d000: 73 65 74 20 64 61 74 65 20 5b 41 73 73 69 67 6e set date [Assign
d010: 42 61 73 65 4d 6f 6e 74 68 20 24 64 61 74 65 5b BaseMonth $date[
d020: 73 65 74 20 64 61 74 65 20 7b 7d 5d 20 5c 0a 2b set date {}] \.+
d030: 09 09 09 24 62 61 73 65 54 69 6d 65 20 24 74 7a ...$baseTime $tz
d040: 20 24 63 68 61 6e 67 65 6f 76 65 72 5d 0a 2b 09 $changeover].+.
d050: 7d 0a 2b 09 69 66 20 7b 21 5b 3a 3a 74 63 6c 3a }.+.if {![::tcl:
d060: 3a 64 69 63 74 3a 3a 65 78 69 73 74 73 20 24 64 :dict::exists $d
d070: 61 74 65 20 64 61 79 4f 66 4d 6f 6e 74 68 5d 7d ate dayOfMonth]}
d080: 20 7b 0a 2b 09 09 76 61 72 69 61 62 6c 65 20 54 {.+..variable T
d090: 5a 44 61 74 61 0a 2b 09 09 73 65 74 20 64 61 74 ZData.+..set dat
d0a0: 65 32 20 5b 47 65 74 44 61 74 65 46 69 65 6c 64 e2 [GetDateField
d0b0: 73 20 24 62 61 73 65 54 69 6d 65 20 24 54 5a 44 s $baseTime $TZD
d0c0: 61 74 61 28 24 74 7a 29 20 24 63 68 61 6e 67 65 ata($tz) $change
d0d0: 6f 76 65 72 5d 0a 2b 09 09 64 69 63 74 20 73 65 over].+..dict se
d0e0: 74 20 64 61 74 65 20 64 61 79 4f 66 4d 6f 6e 74 t date dayOfMont
d0f0: 68 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a h [::tcl::dict::
d100: 67 65 74 20 24 64 61 74 65 32 20 64 61 79 4f 66 get $date2 dayOf
d110: 4d 6f 6e 74 68 5d 0a 2b 09 7d 0a 2b 09 69 66 20 Month].+.}.+.if
d120: 7b 5b 63 61 74 63 68 20 7b 0a 2b 09 09 73 65 74 {[catch {.+..set
d130: 20 64 61 74 65 20 5b 3a 3a 74 63 6c 3a 3a 63 6c date [::tcl::cl
d140: 6f 63 6b 3a 3a 47 65 74 4a 75 6c 69 61 6e 44 61 ock::GetJulianDa
d150: 79 46 72 6f 6d 45 72 61 59 65 61 72 4d 6f 6e 74 yFromEraYearMont
d160: 68 44 61 79 20 24 64 61 74 65 5b 73 65 74 20 64 hDay $date[set d
d170: 61 74 65 20 7b 7d 5d 20 24 63 68 61 6e 67 65 6f ate {}] $changeo
d180: 76 65 72 5d 0a 2b 09 7d 20 6d 73 67 5d 7d 20 7b ver].+.} msg]} {
d190: 0a 2b 09 09 72 65 74 75 72 6e 20 2d 63 6f 64 65 .+..return -code
d1a0: 20 65 72 72 6f 72 20 2d 65 72 72 6f 72 63 6f 64 error -errorcod
d1b0: 65 20 5b 6c 69 73 74 20 43 4c 4f 43 4b 20 69 6e e [list CLOCK in
d1c0: 76 61 6c 69 64 41 72 67 73 5d 20 24 6d 73 67 0a validArgs] $msg.
d1d0: 2b 09 7d 0a 2b 09 23 20 47 65 74 20 74 69 6d 65 +.}.+.# Get time
d1e0: 20 6f 66 20 64 61 79 0a 2b 09 64 69 63 74 20 73 of day.+.dict s
d1f0: 65 74 20 64 61 74 65 20 73 65 63 6f 6e 64 4f 66 et date secondOf
d200: 44 61 79 20 5b 3a 3a 74 63 6c 3a 3a 63 6c 6f 63 Day [::tcl::cloc
d210: 6b 3a 3a 49 6e 74 65 72 70 72 65 74 48 4d 53 20 k::InterpretHMS
d220: 24 64 61 74 65 5d 0a 2b 09 23 20 41 73 73 65 6d $date].+.# Assem
d230: 62 6c 65 20 73 65 63 6f 6e 64 73 2c 20 61 6e 64 ble seconds, and
d240: 20 63 6f 6e 76 65 72 74 20 6c 6f 63 61 6c 20 6e convert local n
d250: 6f 6d 69 6e 61 6c 20 74 69 6d 65 20 74 6f 20 55 ominal time to U
d260: 54 43 2e 0a 2b 09 69 66 20 7b 20 5b 3a 3a 74 63 TC..+.if { [::tc
d270: 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 l::dict::get $da
d280: 74 65 20 6a 75 6c 69 61 6e 44 61 79 5d 20 3e 20 te julianDay] >
d290: 35 33 37 33 34 38 34 20 7d 20 7b 0a 2b 09 09 72 5373484 } {.+..r
d2a0: 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f eturn -code erro
d2b0: 72 20 2d 65 72 72 6f 72 63 6f 64 65 20 5b 6c 69 r -errorcode [li
d2c0: 73 74 20 43 4c 4f 43 4b 20 64 61 74 65 54 6f 6f st CLOCK dateToo
d2d0: 4c 61 72 67 65 5d 20 22 72 65 71 75 65 73 74 65 Large] "requeste
d2e0: 64 20 64 61 74 65 20 74 6f 6f 20 6c 61 72 67 65 d date too large
d2f0: 20 74 6f 20 72 65 70 72 65 73 65 6e 74 22 0a 2b to represent".+
d300: 09 7d 0a 2b 09 64 69 63 74 20 73 65 74 20 64 61 .}.+.dict set da
d310: 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 20 te localSeconds
d320: 5b 73 65 74 20 73 65 63 73 20 5b 65 78 70 72 20 [set secs [expr
d330: 7b 20 2d 32 31 30 38 36 36 38 30 33 32 30 30 0a { -210866803200.
d340: 2b 09 09 2b 20 28 20 38 36 34 30 30 20 2a 20 77 +..+ ( 86400 * w
d350: 69 64 65 28 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 ide([::tcl::dict
d360: 3a 3a 67 65 74 20 24 64 61 74 65 20 6a 75 6c 69 ::get $date juli
d370: 61 6e 44 61 79 5d 29 20 29 0a 2b 09 09 2b 20 5b anDay]) ).+..+ [
d380: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 ::tcl::dict::get
d390: 20 24 64 61 74 65 20 73 65 63 6f 6e 64 4f 66 44 $date secondOfD
d3a0: 61 79 5d 20 7d 5d 5d 0a 2b 09 69 66 20 7b 24 74 ay] }]].+.if {$t
d3b0: 7a 20 21 3d 20 7b 7d 7d 20 7b 0a 2b 09 09 73 65 z != {}} {.+..se
d3c0: 74 20 64 61 74 65 20 5b 3a 3a 74 63 6c 3a 3a 63 t date [::tcl::c
d3d0: 6c 6f 63 6b 3a 3a 43 6f 6e 76 65 72 74 4c 6f 63 lock::ConvertLoc
d3e0: 61 6c 54 6f 55 54 43 20 24 64 61 74 65 5b 73 65 alToUTC $date[se
d3f0: 74 20 64 61 74 65 20 7b 7d 5d 20 24 54 5a 44 61 t date {}] $TZDa
d400: 74 61 28 24 74 7a 29 20 24 63 68 61 6e 67 65 6f ta($tz) $changeo
d410: 76 65 72 5d 0a 2b 09 09 72 65 74 75 72 6e 20 24 ver].+..return $
d420: 64 61 74 65 0a 2b 09 7d 0a 2b 09 23 20 73 65 74 date.+.}.+.# set
d430: 20 73 65 63 6f 6e 64 73 20 74 6f 20 6c 6f 63 61 seconds to loca
d440: 6c 53 65 63 6f 6e 64 73 0a 2b 09 64 69 63 74 20 lSeconds.+.dict
d450: 73 65 74 20 64 61 74 65 20 73 65 63 6f 6e 64 73 set date seconds
d460: 20 24 73 65 63 73 0a 2b 09 72 65 74 75 72 6e 20 $secs.+.return
d470: 24 64 61 74 65 0a 2b 7d 0a 2b 0a 2b 23 2d 2d 2d $date.+}.+.+#---
d480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d4c0: 2d 2d 2d 0a 2b 0a 2b 70 72 6f 63 20 3a 3a 74 63 ---.+.+proc ::tc
d4d0: 6c 3a 3a 63 6c 6f 63 6b 3a 3a 43 6f 6e 76 65 72 l::clock::Conver
d4e0: 74 54 6f 53 65 63 6f 6e 64 73 20 7b 59 20 6d 20 tToSeconds {Y m
d4f0: 64 20 48 20 4d 20 53 20 7b 74 7a 20 7b 7d 7d 7d d H M S {tz {}}}
d500: 20 7b 0a 2b 09 73 65 74 20 64 61 74 65 20 5b 6c {.+.set date [l
d510: 69 73 74 20 5c 0a 2b 09 09 79 65 61 72 20 24 59 ist \.+..year $Y
d520: 20 5c 0a 2b 09 09 6d 6f 6e 74 68 20 24 6d 20 5c \.+..month $m \
d530: 0a 2b 09 09 64 61 79 4f 66 4d 6f 6e 74 68 20 24 .+..dayOfMonth $
d540: 64 20 5c 0a 2b 09 09 68 6f 75 72 20 24 48 20 5c d \.+..hour $H \
d550: 0a 2b 09 09 6d 69 6e 75 74 65 20 24 4d 20 5c 0a .+..minute $M \.
d560: 2b 09 09 73 65 63 6f 6e 64 20 24 53 20 5c 0a 2b +..second $S \.+
d570: 09 5d 0a 2b 0a 2b 09 73 65 74 20 63 68 61 6e 67 .].+.+.set chang
d580: 65 6f 76 65 72 20 32 33 36 31 32 32 32 3b 20 23 eover 2361222; #
d590: 5b 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 6d 63 20 [tcl::clock::mc
d5a0: 47 52 45 47 4f 52 49 41 4e 5f 43 48 41 4e 47 45 GREGORIAN_CHANGE
d5b0: 5f 44 41 54 45 5d 0a 2b 09 69 66 20 7b 24 74 7a _DATE].+.if {$tz
d5c0: 20 3d 3d 20 7b 7d 7d 20 7b 0a 2b 09 09 73 65 74 == {}} {.+..set
d5d0: 20 74 7a 20 5b 47 65 74 53 79 73 74 65 6d 54 69 tz [GetSystemTi
d5e0: 6d 65 5a 6f 6e 65 5d 0a 2b 09 7d 20 65 6c 73 65 meZone].+.} else
d5f0: 69 66 20 7b 24 74 7a 20 6e 69 20 7b 3a 55 54 43 if {$tz ni {:UTC
d600: 20 3a 47 4d 54 7d 7d 20 7b 0a 2b 09 09 76 61 72 :GMT}} {.+..var
d610: 69 61 62 6c 65 20 54 5a 44 61 74 61 0a 2b 09 09 iable TZData.+..
d620: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 if {![info exist
d630: 73 20 54 5a 44 61 74 61 28 24 74 7a 29 5d 7d 20 s TZData($tz)]}
d640: 7b 0a 2b 09 09 09 53 65 74 75 70 54 69 6d 65 5a {.+...SetupTimeZ
d650: 6f 6e 65 20 24 74 7a 0a 2b 09 09 7d 0a 2b 09 7d one $tz.+..}.+.}
d660: 20 65 6c 73 65 20 7b 0a 2b 09 09 23 23 20 64 6f else {.+..## do
d670: 6e 27 74 20 63 6f 6e 76 65 72 74 20 69 6e 20 6c n't convert in l
d680: 6f 63 61 6c 20 3a 0a 2b 09 09 73 65 74 20 74 7a ocal :.+..set tz
d690: 20 7b 7d 0a 2b 09 7d 0a 2b 0a 2b 09 64 69 63 74 {}.+.}.+.+.dict
d6a0: 20 73 65 74 20 64 61 74 65 20 65 72 61 20 43 45 set date era CE
d6b0: 0a 2b 09 23 20 4a 75 6c 69 61 6e 20 44 61 79 20 .+.# Julian Day
d6c0: 4e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20 Number from the
d6d0: 66 69 65 6c 64 73 2e 0a 2b 09 69 66 20 7b 5b 63 fields..+.if {[c
d6e0: 61 74 63 68 20 7b 0a 2b 09 09 73 65 74 20 64 61 atch {.+..set da
d6f0: 74 65 20 5b 47 65 74 4a 75 6c 69 61 6e 44 61 79 te [GetJulianDay
d700: 46 72 6f 6d 45 72 61 59 65 61 72 4d 6f 6e 74 68 FromEraYearMonth
d710: 44 61 79 20 24 64 61 74 65 5b 73 65 74 20 64 61 Day $date[set da
d720: 74 65 20 7b 7d 5d 20 24 63 68 61 6e 67 65 6f 76 te {}] $changeov
d730: 65 72 5d 0a 2b 09 7d 20 6d 73 67 5d 7d 20 7b 0a er].+.} msg]} {.
d740: 2b 09 09 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 +..return -code
d750: 65 72 72 6f 72 20 2d 65 72 72 6f 72 63 6f 64 65 error -errorcode
d760: 20 5b 6c 69 73 74 20 43 4c 4f 43 4b 20 69 6e 76 [list CLOCK inv
d770: 61 6c 69 64 41 72 67 73 5d 20 24 6d 73 67 0a 2b alidArgs] $msg.+
d780: 09 7d 0a 2b 09 23 20 47 65 74 20 74 69 6d 65 20 .}.+.# Get time
d790: 6f 66 20 64 61 79 0a 2b 09 64 69 63 74 20 73 65 of day.+.dict se
d7a0: 74 20 64 61 74 65 20 73 65 63 6f 6e 64 4f 66 44 t date secondOfD
d7b0: 61 79 20 5b 49 6e 74 65 72 70 72 65 74 48 4d 53 ay [InterpretHMS
d7c0: 20 24 64 61 74 65 5d 0a 2b 09 23 20 41 73 73 65 $date].+.# Asse
d7d0: 6d 62 6c 65 20 73 65 63 6f 6e 64 73 2c 20 61 6e mble seconds, an
d7e0: 64 20 63 6f 6e 76 65 72 74 20 6c 6f 63 61 6c 20 d convert local
d7f0: 6e 6f 6d 69 6e 61 6c 20 74 69 6d 65 20 74 6f 20 nominal time to
d800: 55 54 43 2e 0a 2b 09 69 66 20 7b 20 5b 3a 3a 74 UTC..+.if { [::t
d810: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 cl::dict::get $d
d820: 61 74 65 20 6a 75 6c 69 61 6e 44 61 79 5d 20 3e ate julianDay] >
d830: 20 35 33 37 33 34 38 34 20 7d 20 7b 0a 2b 09 09 5373484 } {.+..
d840: 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 return -code err
d850: 6f 72 20 2d 65 72 72 6f 72 63 6f 64 65 20 5b 6c or -errorcode [l
d860: 69 73 74 20 43 4c 4f 43 4b 20 64 61 74 65 54 6f ist CLOCK dateTo
d870: 6f 4c 61 72 67 65 5d 20 22 72 65 71 75 65 73 74 oLarge] "request
d880: 65 64 20 64 61 74 65 20 74 6f 6f 20 6c 61 72 67 ed date too larg
d890: 65 20 74 6f 20 72 65 70 72 65 73 65 6e 74 22 0a e to represent".
d8a0: 2b 09 7d 0a 2b 09 73 65 74 20 73 65 63 73 20 5b +.}.+.set secs [
d8b0: 65 78 70 72 20 7b 20 2d 32 31 30 38 36 36 38 30 expr { -21086680
d8c0: 33 32 30 30 0a 2b 09 09 2b 20 28 20 38 36 34 30 3200.+..+ ( 8640
d8d0: 30 20 2a 20 77 69 64 65 28 5b 3a 3a 74 63 6c 3a 0 * wide([::tcl:
d8e0: 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 :dict::get $date
d8f0: 20 6a 75 6c 69 61 6e 44 61 79 5d 29 20 29 0a 2b julianDay]) ).+
d900: 09 09 2b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 ..+ [::tcl::dict
d910: 3a 3a 67 65 74 20 24 64 61 74 65 20 73 65 63 6f ::get $date seco
d920: 6e 64 4f 66 44 61 79 5d 20 7d 5d 0a 2b 09 69 66 ndOfDay] }].+.if
d930: 20 7b 24 74 7a 20 21 3d 20 7b 7d 7d 20 7b 0a 2b {$tz != {}} {.+
d940: 09 09 76 61 72 69 61 62 6c 65 20 54 5a 44 61 74 ..variable TZDat
d950: 61 0a 2b 09 09 64 69 63 74 20 73 65 74 20 64 61 a.+..dict set da
d960: 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 20 te localSeconds
d970: 24 73 65 63 73 0a 2b 09 09 73 65 74 20 64 61 74 $secs.+..set dat
d980: 65 20 5b 43 6f 6e 76 65 72 74 4c 6f 63 61 6c 54 e [ConvertLocalT
d990: 6f 55 54 43 20 24 64 61 74 65 5b 73 65 74 20 64 oUTC $date[set d
d9a0: 61 74 65 20 7b 7d 5d 20 24 54 5a 44 61 74 61 28 ate {}] $TZData(
d9b0: 24 74 7a 29 20 24 63 68 61 6e 67 65 6f 76 65 72 $tz) $changeover
d9c0: 5d 0a 2b 09 09 23 20 72 65 74 75 72 6e 20 75 74 ].+..# return ut
d9d0: 63 20 3a 0a 2b 09 09 72 65 74 75 72 6e 20 5b 3a c :.+..return [:
d9e0: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 :tcl::dict::get
d9f0: 24 64 61 74 65 20 73 65 63 6f 6e 64 73 5d 0a 2b $date seconds].+
da00: 09 7d 0a 2b 09 23 20 72 65 74 75 72 6e 20 6c 6f .}.+.# return lo
da10: 63 61 6c 53 65 63 6f 6e 64 73 20 28 61 6c 72 65 calSeconds (alre
da20: 61 64 79 20 75 74 63 29 0a 2b 09 72 65 74 75 72 ady utc).+.retur
da30: 6e 20 24 73 65 63 73 0a 2b 7d 0a 2b 0a 2b 23 2d n $secs.+}.+.+#-
da40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
da50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
da60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
da70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
da80: 2d 2d 2d 2d 2d 0a 2b 0a 2b 70 72 6f 63 20 3a 3a -----.+.+proc ::
da90: 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 43 6f 6e 76 tcl::clock::Conv
daa0: 65 72 74 46 72 6f 6d 53 65 63 6f 6e 64 73 20 7b ertFromSeconds {
dab0: 63 6c 6f 63 6b 20 7b 74 7a 20 7b 7d 7d 7d 20 7b clock {tz {}}} {
dac0: 0a 2b 09 76 61 72 69 61 62 6c 65 20 54 5a 44 61 .+.variable TZDa
dad0: 74 61 0a 2b 0a 2b 09 73 65 74 20 63 68 61 6e 67 ta.+.+.set chang
dae0: 65 6f 76 65 72 20 32 33 36 31 32 32 32 3b 20 23 eover 2361222; #
daf0: 5b 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 6d 63 20 [tcl::clock::mc
db00: 47 52 45 47 4f 52 49 41 4e 5f 43 48 41 4e 47 45 GREGORIAN_CHANGE
db10: 5f 44 41 54 45 5d 0a 2b 09 69 66 20 7b 24 74 7a _DATE].+.if {$tz
db20: 20 3d 3d 20 7b 7d 7d 20 7b 0a 2b 09 09 73 65 74 == {}} {.+..set
db30: 20 74 7a 20 5b 47 65 74 53 79 73 74 65 6d 54 69 tz [GetSystemTi
db40: 6d 65 5a 6f 6e 65 5d 0a 2b 09 7d 20 65 6c 73 65 meZone].+.} else
db50: 69 66 20 7b 24 74 7a 20 6e 69 20 7b 3a 55 54 43 if {$tz ni {:UTC
db60: 20 3a 47 4d 54 7d 7d 20 7b 0a 2b 09 09 69 66 20 :GMT}} {.+..if
db70: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 54 {![info exists T
db80: 5a 44 61 74 61 28 24 74 7a 29 5d 7d 20 7b 0a 2b ZData($tz)]} {.+
db90: 09 09 09 53 65 74 75 70 54 69 6d 65 5a 6f 6e 65 ...SetupTimeZone
dba0: 20 24 74 7a 0a 2b 09 09 7d 0a 2b 09 7d 0a 2b 09 $tz.+..}.+.}.+.
dbb0: 23 23 20 67 65 74 20 64 61 74 65 20 76 61 72 20 ## get date var
dbc0: 3a 0a 2b 09 73 65 74 20 64 61 74 65 20 5b 47 65 :.+.set date [Ge
dbd0: 74 44 61 74 65 46 69 65 6c 64 73 20 24 63 6c 6f tDateFields $clo
dbe0: 63 6b 20 24 54 5a 44 61 74 61 28 24 74 7a 29 20 ck $TZData($tz)
dbf0: 24 63 68 61 6e 67 65 6f 76 65 72 5d 0a 2b 09 73 $changeover].+.s
dc00: 65 74 20 74 69 6d 65 20 5b 3a 3a 74 63 6c 3a 3a et time [::tcl::
dc10: 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 dict::get $date
dc20: 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d 0a 2b 09 localSeconds].+.
dc30: 23 23 20 72 65 74 75 72 6e 20 6c 69 73 74 20 59 ## return list Y
dc40: 20 6d 20 64 20 48 20 4d 20 53 0a 2b 09 6c 69 73 m d H M S.+.lis
dc50: 74 20 5c 0a 2b 09 09 5b 3a 3a 74 63 6c 3a 3a 64 t \.+..[::tcl::d
dc60: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 79 ict::get $date y
dc70: 65 61 72 5d 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 ear] [::tcl::dic
dc80: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 6d 6f 6e t::get $date mon
dc90: 74 68 5d 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 th] [::tcl::dict
dca0: 3a 3a 67 65 74 20 24 64 61 74 65 20 64 61 79 4f ::get $date dayO
dcb0: 66 4d 6f 6e 74 68 5d 20 5c 0a 2b 09 09 5b 65 78 fMonth] \.+..[ex
dcc0: 70 72 20 7b 24 74 69 6d 65 20 2f 20 33 36 30 30 pr {$time / 3600
dcd0: 20 25 20 32 34 7d 5d 20 5b 65 78 70 72 20 7b 24 % 24}] [expr {$
dce0: 74 69 6d 65 20 2f 20 36 30 20 25 20 36 30 7d 5d time / 60 % 60}]
dcf0: 20 5b 65 78 70 72 20 7b 24 74 69 6d 65 20 25 20 [expr {$time %
dd00: 36 30 7d 5d 0a 2b 7d 0a 2b 0a 2b 23 2d 2d 2d 2d 60}].+}.+.+#----
dd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dd50: 2d 2d 0a --.