File Coverage

blib/lib/Olson/Abbreviations.pm
Criterion Covered Total %
statement 7 9 77.7
branch n/a
condition n/a
subroutine 3 3 100.0
pod n/a
total 10 12 83.3


line stmt bran cond sub pod time code
1             package Olson::Abbreviations;
2 3     3   35776 use strict;
  3         6  
  3         107  
3 3     3   15 use warnings;
  3         7  
  3         85  
4              
5 3     3   2439 use Moose;
  0            
  0            
6              
7             use MooseX::ClassAttribute;
8             use namespace::autoclean;
9              
10             our $VERSION = '0.04';
11              
12             class_has 'ZONEMAP' => (
13             isa => 'HashRef[Maybe[Str]]'
14             , is => 'rw'
15             , traits => ['Hash']
16             , handles => {
17             '_exists' => 'exists'
18             , '_get' => 'get'
19             , '_defined' => 'defined'
20             }
21             , default => sub {
22             # Table for mapping abbreviated timezone names to tz_abbreviations
23             return {
24             'A' => '+0100', 'ACDT' => '+1030', 'ACST' => '+0930',
25             'ADT' => undef, 'AEDT' => '+1100', 'AES' => '+1000',
26             'AEST' => '+1000', 'AFT' => '+0430', 'AHDT' => '-0900',
27             'AHST' => '-1000', 'AKDT' => '-0800', 'AKST' => '-0900',
28             'AMST' => '+0400', 'AMT' => '+0400', 'ANAST' => '+1300',
29             'ANAT' => '+1200', 'ART' => '-0300', 'AST' => undef,
30             'AT' => '-0100', 'AWST' => '+0800', 'AZOST' => '+0000',
31             'AZOT' => '-0100', 'AZST' => '+0500', 'AZT' => '+0400',
32             'B' => '+0200', 'BADT' => '+0400', 'BAT' => '+0600',
33             'BDST' => '+0200', 'BDT' => '+0600', 'BET' => '-1100',
34             'BNT' => '+0800', 'BORT' => '+0800', 'BOT' => '-0400',
35             'BRA' => '-0300', 'BST' => undef, 'BT' => undef,
36             'BTT' => '+0600', 'C' => '+0300', 'CAST' => '+0930',
37             'CAT' => undef, 'CCT' => undef, 'CDT' => undef,
38             'CEST' => '+0200', 'CET' => '+0100', 'CETDST' => '+0200',
39             'CHADT' => '+1345', 'CHAST' => '+1245', 'CKT' => '-1000',
40             'CLST' => '-0300', 'CLT' => '-0400', 'COT' => '-0500',
41             'CST' => undef, 'CSuT' => '+1030', 'CUT' => '+0000',
42             'CVT' => '-0100', 'CXT' => '+0700', 'ChST' => '+1000',
43             'D' => '+0400', 'DAVT' => '+0700', 'DDUT' => '+1000',
44             'DNT' => '+0100', 'DST' => '+0200', 'E' => '+0500',
45             'EASST' => '-0500', 'EAST' => undef, 'EAT' => '+0300',
46             'ECT' => undef, 'EDT' => undef, 'EEST' => '+0300',
47             'EET' => '+0200', 'EETDST' => '+0300', 'EGST' => '+0000',
48             'EGT' => '-0100', 'EMT' => '+0100', 'EST' => undef,
49             'ESuT' => '+1100', 'F' => '+0600', 'FDT' => undef,
50             'FJST' => '+1300', 'FJT' => '+1200', 'FKST' => '-0300',
51             'FKT' => '-0400', 'FST' => undef, 'FWT' => '+0100',
52             'G' => '+0700', 'GALT' => '-0600', 'GAMT' => '-0900',
53             'GEST' => '+0500', 'GET' => '+0400', 'GFT' => '-0300',
54             'GILT' => '+1200', 'GMT' => '+0000', 'GST' => undef,
55             'GT' => '+0000', 'GYT' => '-0400', 'GZ' => '+0000',
56             'H' => '+0800', 'HAA' => '-0300', 'HAC' => '-0500',
57             'HAE' => '-0400', 'HAP' => '-0700', 'HAR' => '-0600',
58             'HAT' => '-0230', 'HAY' => '-0800', 'HDT' => '-0930',
59             'HFE' => '+0200', 'HFH' => '+0100', 'HG' => '+0000',
60             'HKT' => '+0800', 'HL' => 'local', 'HNA' => '-0400',
61             'HNC' => '-0600', 'HNE' => '-0500', 'HNP' => '-0800',
62             'HNR' => '-0700', 'HNT' => '-0330', 'HNY' => '-0900',
63             'HOE' => '+0100', 'HST' => '-1000', 'I' => '+0900',
64             'ICT' => '+0700', 'IDLE' => '+1200', 'IDLW' => '-1200',
65             'IDT' => undef, 'IOT' => '+0500', 'IRDT' => '+0430',
66             'IRKST' => '+0900', 'IRKT' => '+0800', 'IRST' => '+0430',
67             'IRT' => '+0330', 'IST' => undef, 'IT' => '+0330',
68             'ITA' => '+0100', 'JAVT' => '+0700', 'JAYT' => '+0900',
69             'JST' => '+0900', 'JT' => '+0700', 'K' => '+1000',
70             'KDT' => '+1000', 'KGST' => '+0600', 'KGT' => '+0500',
71             'KOST' => '+1200', 'KRAST' => '+0800', 'KRAT' => '+0700',
72             'KST' => '+0900', 'L' => '+1100', 'LHDT' => '+1100',
73             'LHST' => '+1030', 'LIGT' => '+1000', 'LINT' => '+1400',
74             'LKT' => '+0600', 'LST' => 'local', 'LT' => 'local',
75             'M' => '+1200', 'MAGST' => '+1200', 'MAGT' => '+1100',
76             'MAL' => '+0800', 'MART' => '-0930', 'MAT' => '+0300',
77             'MAWT' => '+0600', 'MDT' => '-0600', 'MED' => '+0200',
78             'MEDST' => '+0200', 'MEST' => '+0200', 'MESZ' => '+0200',
79             'MET' => undef, 'MEWT' => '+0100', 'MEX' => '-0600',
80             'MEZ' => '+0100', 'MHT' => '+1200', 'MMT' => '+0630',
81             'MPT' => '+1000', 'MSD' => '+0400', 'MSK' => '+0300',
82             'MSKS' => '+0400', 'MST' => '-0700', 'MT' => '+0830',
83             'MUT' => '+0400', 'MVT' => '+0500', 'MYT' => '+0800',
84             'N' => '-0100', 'NCT' => '+1100', 'NDT' => '-0230',
85             'NFT' => undef, 'NOR' => '+0100', 'NOVST' => '+0700',
86             'NOVT' => '+0600', 'NPT' => '+0545', 'NRT' => '+1200',
87             'NST' => undef, 'NSUT' => '+0630', 'NT' => '-1100',
88             'NUT' => '-1100', 'NZDT' => '+1300', 'NZST' => '+1200',
89             'NZT' => '+1200', 'O' => '-0200', 'OESZ' => '+0300',
90             'OEZ' => '+0200', 'OMSST' => '+0700', 'OMST' => '+0600',
91             'OZ' => 'local', 'P' => '-0300', 'PDT' => '-0700',
92             'PET' => '-0500', 'PETST' => '+1300', 'PETT' => '+1200',
93             'PGT' => '+1000', 'PHOT' => '+1300', 'PHT' => '+0800',
94             'PKT' => '+0500', 'PMDT' => '-0200', 'PMT' => '-0300',
95             'PNT' => '-0830', 'PONT' => '+1100', 'PST' => '-0800',
96             'PWT' => '+0900', 'PYST' => '-0300', 'PYT' => '-0400',
97             'Q' => '-0400', 'R' => '-0500', 'R1T' => '+0200',
98             'R2T' => '+0300', 'RET' => '+0400', 'ROK' => '+0900',
99             'S' => '-0600', 'SADT' => '+1030', 'SAST' => undef,
100             'SBT' => '+1100', 'SCT' => '+0400', 'SET' => '+0100',
101             'SGT' => '+0800', 'SRT' => '-0300', 'SST' => undef,
102             'SWT' => '+0100', 'T' => '-0700', 'TFT' => '+0500',
103             'THA' => '+0700', 'THAT' => '-1000', 'TJT' => '+0500',
104             'TKT' => '-1000', 'TMT' => '+0500', 'TOT' => '+1300',
105             'TRUT' => '+1000', 'TST' => '+0300', 'TUC' => '+0000',
106             'TVT' => '+1200', 'U' => '-0800', 'ULAST' => '+0900',
107             'ULAT' => '+0800', 'USZ1' => '+0200', 'USZ1S' => '+0300',
108             'USZ3' => '+0400', 'USZ3S' => '+0500', 'USZ4' => '+0500',
109             'USZ4S' => '+0600', 'USZ5' => '+0600', 'USZ5S' => '+0700',
110             'USZ6' => '+0700', 'USZ6S' => '+0800', 'USZ7' => '+0800',
111             'USZ7S' => '+0900', 'USZ8' => '+0900', 'USZ8S' => '+1000',
112             'USZ9' => '+1000', 'USZ9S' => '+1100', 'UTZ' => '-0300',
113             'UYT' => '-0300', 'UZ10' => '+1100', 'UZ10S' => '+1200',
114             'UZ11' => '+1200', 'UZ11S' => '+1300', 'UZ12' => '+1200',
115             'UZ12S' => '+1300', 'UZT' => '+0500', 'V' => '-0900',
116             'VET' => '-0400', 'VLAST' => '+1100', 'VLAT' => '+1000',
117             'VTZ' => '-0200', 'VUT' => '+1100', 'W' => '-1000',
118             'WAKT' => '+1200', 'WAST' => undef, 'WAT' => '+0100',
119             'WEST' => '+0100', 'WESZ' => '+0100', 'WET' => '+0000',
120             'WETDST' => '+0100', 'WEZ' => '+0000', 'WFT' => '+1200',
121             'WGST' => '-0200', 'WGT' => '-0300', 'WIB' => '+0700',
122             'WIT' => '+0900', 'WITA' => '+0800', 'WST' => undef,
123             'WTZ' => '-0100', 'WUT' => '+0100', 'X' => '-1100',
124             'Y' => '-1200', 'YAKST' => '+1000', 'YAKT' => '+0900',
125             'YAPT' => '+1000', 'YDT' => '-0800', 'YEKST' => '+0600',
126             'YEKT' => '+0500', 'YST' => '-0900', 'Z' => '+0000',
127             }
128             }
129             );
130              
131             has 'tz_abbreviation' => ( isa => 'Str', is => 'rw', required => 1 );
132              
133             sub is_known {
134             my $self = shift;
135             $self->_exists( $self->tz_abbreviation );
136             }
137              
138             sub is_unambigious {
139             my $self = shift;
140             $self->_defined( $self->tz_abbreviation );
141             }
142              
143             sub get_offset {
144             my $self = shift;
145              
146             Carp::croak 'Unknown abreviation please submit '
147             . $self->tz_abbreviation
148             . ' to : http://rt.cpan.org/NoAuth/Bugs.html?Dist=Olson-Abbreviations'
149             unless $self->is_known
150             ;
151              
152             Carp::croak "Globally ambigious abbreviation detected"
153             unless $self->is_unambigious;
154             ;
155              
156             $self->_get( $self->tz_abbreviation );
157             }
158              
159             __PACKAGE__->meta->make_immutable;
160              
161             1;
162              
163             __END__
164              
165             =head1 NAME
166              
167             Olson::Abbreviations -globally unique timezones abbreviation handling
168              
169             =head1 DESCRIPTION
170              
171             This module should help you with converting commonly used and often ambigious olson
172             abbreviations into TZ offset notation.
173              
174             =head2 NOT COMPLETE
175              
176             This module is released as 0.01 because it is useful. It is not complete. In order to
177             be complete in the author's eyes this module must accept a locale and disambiguate based
178             on that.
179              
180             EST is not ambigious if your standing in the US or in Austrailia. This module should
181             handle this properly in the future.
182              
183             =head1 SYNOPSIS
184              
185             Quick summary of what the module does.
186              
187             Perhaps a little code snippet.
188              
189             use Olson::Abbreviations;
190              
191             my $oa = Olson::Abbreviations->new({ tz_abbreviation => 'EST' });
192             $oa->is_unambigious; # returns 0
193             $oa->is_known; # returns 1
194             $oa->get_offset # dies
195             ...
196              
197             =head1 METHODS
198              
199             =over 12
200              
201             =item get_offset
202              
203             Returns the offset to UTC
204              
205             =item is_unambigious
206              
207             Returns 0|1 based on if the abbreviation is globally unambigious to the whole planet
208              
209             =item is_known
210              
211             Returns 0|1 based on if the abbreviation is known despite if it is ambigious or not
212              
213             =back
214              
215             =head1 AUTHOR
216              
217             Evan Carroll, C<< <me+cpan at evancarroll.com> >>
218              
219             =head1 BUGS
220              
221             Please report any bugs or feature requests to C<bug-olson-abbreviations at rt.cpan.org>, or through
222             the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Olson-Abbreviations>. I will be notified, and then you'll
223             automatically be notified of progress on your bug as I make changes.
224              
225             =head1 SUPPORT
226              
227             You can find documentation for this module with the perldoc command.
228              
229             perldoc Olson::Abbreviations
230              
231              
232             You can also look for information at:
233              
234             =over 4
235              
236             =item * RT: CPAN's request tracker
237              
238             L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Olson-Abbreviations>
239              
240             =item * AnnoCPAN: Annotated CPAN documentation
241              
242             L<http://annocpan.org/dist/Olson-Abbreviations>
243              
244             =item * CPAN Ratings
245              
246             L<http://cpanratings.perl.org/d/Olson-Abbreviations>
247              
248             =item * Search CPAN
249              
250             L<http://search.cpan.org/dist/Olson-Abbreviations/>
251              
252             =back
253              
254             =head1 COPYRIGHT & LICENSE
255              
256             Copyright 2012 Evan Carroll, all rights reserved.
257              
258             This program is free software; you can redistribute it and/or modify it
259             under the same terms as Perl itself.
260              
261              
262             =cut
263              
264             1; # End of Olson::Abbreviations