Filename | /usr/share/perl5/vendor_perl/Time/Timezone.pm |
Statements | Executed 24 statements in 1.13ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
1 | 1 | 1 | 14µs | 37µs | BEGIN@10 | Time::Timezone::
1 | 1 | 1 | 13µs | 46µs | BEGIN@110 | Time::Timezone::
1 | 1 | 1 | 10µs | 24µs | BEGIN@23 | Time::Timezone::
1 | 1 | 1 | 9µs | 27µs | BEGIN@15 | Time::Timezone::
1 | 1 | 1 | 8µs | 19µs | BEGIN@11 | Time::Timezone::
0 | 0 | 0 | 0s | 0s | calc_off | Time::Timezone::
0 | 0 | 0 | 0s | 0s | tz2zone | Time::Timezone::
0 | 0 | 0 | 0s | 0s | tz_local_offset | Time::Timezone::
0 | 0 | 0 | 0s | 0s | tz_name | Time::Timezone::
0 | 0 | 0 | 0s | 0s | tz_offset | Time::Timezone::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package Time::Timezone; | ||||
2 | |||||
3 | 1 | 14µs | require 5.002; | ||
4 | |||||
5 | 1 | 400ns | require Exporter; | ||
6 | 1 | 7µs | @ISA = qw(Exporter); | ||
7 | 1 | 1µs | @EXPORT = qw(tz2zone tz_local_offset tz_offset tz_name); | ||
8 | 1 | 200ns | @EXPORT_OK = qw(); | ||
9 | |||||
10 | 2 | 26µs | 2 | 60µs | # spent 37µs (14+23) within Time::Timezone::BEGIN@10 which was called:
# once (14µs+23µs) by Time::ParseDate::BEGIN@6 at line 10 # spent 37µs making 1 call to Time::Timezone::BEGIN@10
# spent 23µs making 1 call to Exporter::import |
11 | 2 | 27µs | 2 | 30µs | # spent 19µs (8+11) within Time::Timezone::BEGIN@11 which was called:
# once (8µs+11µs) by Time::ParseDate::BEGIN@6 at line 11 # spent 19µs making 1 call to Time::Timezone::BEGIN@11
# spent 11µs making 1 call to strict::import |
12 | |||||
13 | # Parts stolen from code by Paul Foley <paul@ascent.com> | ||||
14 | |||||
15 | 2 | 50µs | 2 | 45µs | # spent 27µs (9+18) within Time::Timezone::BEGIN@15 which was called:
# once (9µs+18µs) by Time::ParseDate::BEGIN@6 at line 15 # spent 27µs making 1 call to Time::Timezone::BEGIN@15
# spent 18µs making 1 call to vars::import |
16 | |||||
17 | 1 | 200ns | $VERSION = 2006.0814; | ||
18 | |||||
19 | sub tz2zone | ||||
20 | { | ||||
21 | my($TZ, $time, $isdst) = @_; | ||||
22 | |||||
23 | 2 | 320µs | 2 | 39µs | # spent 24µs (10+15) within Time::Timezone::BEGIN@23 which was called:
# once (10µs+15µs) by Time::ParseDate::BEGIN@6 at line 23 # spent 24µs making 1 call to Time::Timezone::BEGIN@23
# spent 15µs making 1 call to vars::import |
24 | |||||
25 | $TZ = defined($ENV{'TZ'}) ? ( $ENV{'TZ'} ? $ENV{'TZ'} : 'GMT' ) : '' | ||||
26 | unless $TZ; | ||||
27 | |||||
28 | # Hack to deal with 'PST8PDT' format of TZ | ||||
29 | # Note that this can't deal with all the esoteric forms, but it | ||||
30 | # does recognize the most common: [:]STDoff[DST[off][,rule]] | ||||
31 | |||||
32 | if (! defined $isdst) { | ||||
33 | my $j; | ||||
34 | $time = time() unless $time; | ||||
35 | ($j, $j, $j, $j, $j, $j, $j, $j, $isdst) = localtime($time); | ||||
36 | } | ||||
37 | |||||
38 | if (defined $tzn_cache{$TZ}->[$isdst]) { | ||||
39 | return $tzn_cache{$TZ}->[$isdst]; | ||||
40 | } | ||||
41 | |||||
42 | if ($TZ =~ /^ | ||||
43 | ( [^:\d+\-,] {3,} ) | ||||
44 | ( [+-] ? | ||||
45 | \d {1,2} | ||||
46 | ( : \d {1,2} ) {0,2} | ||||
47 | ) | ||||
48 | ( [^\d+\-,] {3,} )? | ||||
49 | /x | ||||
50 | ) { | ||||
51 | $TZ = $isdst ? $4 : $1; | ||||
52 | $tzn_cache{$TZ} = [ $1, $4 ]; | ||||
53 | } else { | ||||
54 | $tzn_cache{$TZ} = [ $TZ, $TZ ]; | ||||
55 | } | ||||
56 | return $TZ; | ||||
57 | } | ||||
58 | |||||
59 | sub tz_local_offset | ||||
60 | { | ||||
61 | my ($time) = @_; | ||||
62 | |||||
63 | $time = time() unless $time; | ||||
64 | |||||
65 | return &calc_off($time); | ||||
66 | } | ||||
67 | |||||
68 | sub calc_off | ||||
69 | { | ||||
70 | my ($time) = @_; | ||||
71 | |||||
72 | my (@l) = localtime($time); | ||||
73 | my (@g) = gmtime($time); | ||||
74 | |||||
75 | my $off; | ||||
76 | |||||
77 | $off = $l[0] - $g[0] | ||||
78 | + ($l[1] - $g[1]) * 60 | ||||
79 | + ($l[2] - $g[2]) * 3600; | ||||
80 | |||||
81 | # subscript 7 is yday. | ||||
82 | |||||
83 | if ($l[7] == $g[7]) { | ||||
84 | # done | ||||
85 | } elsif ($l[7] == $g[7] + 1) { | ||||
86 | $off += 86400; | ||||
87 | } elsif ($l[7] == $g[7] - 1) { | ||||
88 | $off -= 86400; | ||||
89 | } elsif ($l[7] < $g[7]) { | ||||
90 | # crossed over a year boundary! | ||||
91 | # localtime is beginning of year, gmt is end | ||||
92 | # therefore local is ahead | ||||
93 | $off += 86400; | ||||
94 | } else { | ||||
95 | $off -= 86400; | ||||
96 | } | ||||
97 | |||||
98 | return $off; | ||||
99 | } | ||||
100 | |||||
101 | # constants | ||||
102 | # The rest of the file originally comes from Graham Barr <bodg@tiuk.ti.com> | ||||
103 | # | ||||
104 | # Some references: | ||||
105 | # http://www.weltzeituhr.com/laender/zeitzonen_e.shtml | ||||
106 | # http://www.worldtimezone.com/wtz-names/timezonenames.html | ||||
107 | # http://www.timegenie.com/timezones.php | ||||
108 | |||||
109 | 1 | 6µs | 1 | 33µs | CONFIG: { # spent 33µs making 1 call to vars::import |
110 | 2 | 577µs | 1 | 46µs | # spent 46µs (13+33) within Time::Timezone::BEGIN@110 which was called:
# once (13µs+33µs) by Time::ParseDate::BEGIN@6 at line 110 # spent 46µs making 1 call to Time::Timezone::BEGIN@110 |
111 | |||||
112 | 1 | 8µs | %dstZone = ( | ||
113 | "brst" => -2*3600, # Brazil Summer Time (East Daylight) | ||||
114 | "adt" => -3*3600, # Atlantic Daylight | ||||
115 | "edt" => -4*3600, # Eastern Daylight | ||||
116 | "cdt" => -5*3600, # Central Daylight | ||||
117 | "mdt" => -6*3600, # Mountain Daylight | ||||
118 | "pdt" => -7*3600, # Pacific Daylight | ||||
119 | "ydt" => -8*3600, # Yukon Daylight | ||||
120 | "hdt" => -9*3600, # Hawaii Daylight | ||||
121 | "bst" => +1*3600, # British Summer | ||||
122 | "mest" => +2*3600, # Middle European Summer | ||||
123 | "met dst" => +2*3600, # Middle European Summer | ||||
124 | "sst" => +2*3600, # Swedish Summer | ||||
125 | "fst" => +2*3600, # French Summer | ||||
126 | "eest" => +3*3600, # Eastern European Summer | ||||
127 | "cest" => +2*3600, # Central European Daylight | ||||
128 | "wadt" => +8*3600, # West Australian Daylight | ||||
129 | "kdt" => +10*3600, # Korean Daylight | ||||
130 | # "cadt" => +10*3600+1800, # Central Australian Daylight | ||||
131 | "eadt" => +11*3600, # Eastern Australian Daylight | ||||
132 | "nzdt" => +13*3600, # New Zealand Daylight | ||||
133 | ); | ||||
134 | |||||
135 | # not included due to ambiguity: | ||||
136 | # IST Indian Standard Time +5.5 | ||||
137 | # Ireland Standard Time 0 | ||||
138 | # Israel Standard Time +2 | ||||
139 | # IDT Ireland Daylight Time +1 | ||||
140 | # Israel Daylight Time +3 | ||||
141 | # AMST Amazon Standard Time / -3 | ||||
142 | # Armenia Standard Time +8 | ||||
143 | # BST Brazil Standard -3 | ||||
144 | |||||
145 | 1 | 31µs | %Zone = ( | ||
146 | "gmt" => 0, # Greenwich Mean | ||||
147 | "ut" => 0, # Universal (Coordinated) | ||||
148 | "utc" => 0, | ||||
149 | "wet" => 0, # Western European | ||||
150 | "wat" => -1*3600, # West Africa | ||||
151 | "azost" => -1*3600, # Azores Standard Time | ||||
152 | "cvt" => -1*3600, # Cape Verde Time | ||||
153 | "at" => -2*3600, # Azores | ||||
154 | "fnt" => -2*3600, # Brazil Time (Extreme East - Fernando Noronha) | ||||
155 | "ndt" => -2*3600-1800,# Newfoundland Daylight | ||||
156 | "art" => -3*3600, # Argentina Time | ||||
157 | # For completeness. BST is also British Summer, and GST is also Guam Standard. | ||||
158 | # "gst" => -3*3600, # Greenland Standard | ||||
159 | "nft" => -3*3600-1800,# Newfoundland | ||||
160 | # "nst" => -3*3600-1800,# Newfoundland Standard | ||||
161 | "mnt" => -4*3600, # Brazil Time (West Standard - Manaus) | ||||
162 | "ewt" => -4*3600, # U.S. Eastern War Time | ||||
163 | "ast" => -4*3600, # Atlantic Standard | ||||
164 | "bot" => -4*3600, # Bolivia Time | ||||
165 | "vet" => -4*3600, # Venezuela Time | ||||
166 | "est" => -5*3600, # Eastern Standard | ||||
167 | "cot" => -5*3600, # Colombia Time | ||||
168 | "act" => -5*3600, # Brazil Time (Extreme West - Acre) | ||||
169 | "pet" => -5*3600, # Peru Time | ||||
170 | "cst" => -6*3600, # Central Standard | ||||
171 | "cest" => +2*3600, # Central European Summer | ||||
172 | "mst" => -7*3600, # Mountain Standard | ||||
173 | "pst" => -8*3600, # Pacific Standard | ||||
174 | "yst" => -9*3600, # Yukon Standard | ||||
175 | "hst" => -10*3600, # Hawaii Standard | ||||
176 | "cat" => -10*3600, # Central Alaska | ||||
177 | "ahst" => -10*3600, # Alaska-Hawaii Standard | ||||
178 | "taht" => -10*3600, # Tahiti Time | ||||
179 | "nt" => -11*3600, # Nome | ||||
180 | "idlw" => -12*3600, # International Date Line West | ||||
181 | "cet" => +1*3600, # Central European | ||||
182 | "mez" => +1*3600, # Central European (German) | ||||
183 | "met" => +1*3600, # Middle European | ||||
184 | "mewt" => +1*3600, # Middle European Winter | ||||
185 | "swt" => +1*3600, # Swedish Winter | ||||
186 | "set" => +1*3600, # Seychelles | ||||
187 | "fwt" => +1*3600, # French Winter | ||||
188 | "west" => +1*3600, # Western Europe Summer Time | ||||
189 | "eet" => +2*3600, # Eastern Europe, USSR Zone 1 | ||||
190 | "ukr" => +2*3600, # Ukraine | ||||
191 | "sast" => +2*3600, # South Africa Standard Time | ||||
192 | "bt" => +3*3600, # Baghdad, USSR Zone 2 | ||||
193 | "eat" => +3*3600, # East Africa Time | ||||
194 | # "it" => +3*3600+1800,# Iran | ||||
195 | "irst" => +3*3600+1800,# Iran Standard Time | ||||
196 | "zp4" => +4*3600, # USSR Zone 3 | ||||
197 | "msd" => +4*3600, # Moscow Daylight Time | ||||
198 | "sct" => +4*3600, # Seychelles Time | ||||
199 | "zp5" => +5*3600, # USSR Zone 4 | ||||
200 | "azst" => +5*3600, # Azerbaijan Summer Time | ||||
201 | "mvt" => +5*3600, # Maldives Time | ||||
202 | "uzt" => +5*3600, # Uzbekistan Time | ||||
203 | "ist" => +5*3600+1800,# Indian Standard | ||||
204 | "zp6" => +6*3600, # USSR Zone 5 | ||||
205 | "lkt" => +6*3600, # Sri Lanka Time | ||||
206 | "pkst" => +6*3600, # Pakistan Summer Time | ||||
207 | "yekst" => +6*3600, # Yekaterinburg Summer Time | ||||
208 | # For completeness. NST is also Newfoundland Stanard, and SST is also Swedish Summer. | ||||
209 | # "nst" => +6*3600+1800,# North Sumatra | ||||
210 | # "sst" => +7*3600, # South Sumatra, USSR Zone 6 | ||||
211 | "wast" => +7*3600, # West Australian Standard | ||||
212 | "ict" => +7*3600, # Indochina Time | ||||
213 | "wit" => +7*3600, # Western Indonesia Time | ||||
214 | # "jt" => +7*3600+1800,# Java (3pm in Cronusland!) | ||||
215 | "cct" => +8*3600, # China Coast, USSR Zone 7 | ||||
216 | "wst" => +8*3600, # West Australian Standard | ||||
217 | "hkt" => +8*3600, # Hong Kong | ||||
218 | "bnt" => +8*3600, # Brunei Darussalam Time | ||||
219 | "cit" => +8*3600, # Central Indonesia Time | ||||
220 | "myt" => +8*3600, # Malaysia Time | ||||
221 | "pht" => +8*3600, # Philippines Time | ||||
222 | "sgt" => +8*3600, # Singapore Time | ||||
223 | "jst" => +9*3600, # Japan Standard, USSR Zone 8 | ||||
224 | "kst" => +9*3600, # Korean Standard | ||||
225 | # "cast" => +9*3600+1800,# Central Australian Standard | ||||
226 | "east" => +10*3600, # Eastern Australian Standard | ||||
227 | "gst" => +10*3600, # Guam Standard, USSR Zone 9 | ||||
228 | "nct" => +11*3600, # New Caledonia Time | ||||
229 | "nzt" => +12*3600, # New Zealand | ||||
230 | "nzst" => +12*3600, # New Zealand Standard | ||||
231 | "fjt" => +12*3600, # Fiji Time | ||||
232 | "idle" => +12*3600, # International Date Line East | ||||
233 | ); | ||||
234 | |||||
235 | 1 | 33µs | %zoneOff = reverse(%Zone); | ||
236 | 1 | 8µs | %dstZoneOff = reverse(%dstZone); | ||
237 | |||||
238 | # Preferences | ||||
239 | |||||
240 | 1 | 800ns | $zoneOff{0} = 'gmt'; | ||
241 | 1 | 500ns | $dstZoneOff{3600} = 'bst'; | ||
242 | |||||
243 | } | ||||
244 | |||||
245 | sub tz_offset | ||||
246 | { | ||||
247 | my ($zone, $time) = @_; | ||||
248 | |||||
249 | return &tz_local_offset() unless($zone); | ||||
250 | |||||
251 | $time = time() unless $time; | ||||
252 | my(@l) = localtime($time); | ||||
253 | my $dst = $l[8]; | ||||
254 | |||||
255 | $zone = lc $zone; | ||||
256 | |||||
257 | if ($zone =~ /^([\-\+]\d{3,4})$/) { | ||||
258 | my $sign = $1 < 0 ? -1 : 1 ; | ||||
259 | my $v = abs(0 + $1); | ||||
260 | return $sign * 60 * (int($v / 100) * 60 + ($v % 100)); | ||||
261 | } elsif (exists $dstZone{$zone} && ($dst || !exists $Zone{$zone})) { | ||||
262 | return $dstZone{$zone}; | ||||
263 | } elsif(exists $Zone{$zone}) { | ||||
264 | return $Zone{$zone}; | ||||
265 | } | ||||
266 | undef; | ||||
267 | } | ||||
268 | |||||
269 | sub tz_name | ||||
270 | { | ||||
271 | my ($off, $time) = @_; | ||||
272 | |||||
273 | $time = time() unless $time; | ||||
274 | my(@l) = localtime($time); | ||||
275 | my $dst = $l[8]; | ||||
276 | |||||
277 | if (exists $dstZoneOff{$off} && ($dst || !exists $zoneOff{$off})) { | ||||
278 | return $dstZoneOff{$off}; | ||||
279 | } elsif (exists $zoneOff{$off}) { | ||||
280 | return $zoneOff{$off}; | ||||
281 | } | ||||
282 | sprintf("%+05d", int($off / 60) * 100 + $off % 60); | ||||
283 | } | ||||
284 | |||||
285 | 1 | 20µs | 1; | ||
286 | |||||
287 | __END__ |