File Coverage

blib/lib/Bootylicious/Timestamp.pm
Criterion Covered Total %
statement 39 39 100.0
branch 6 8 75.0
condition 7 9 77.7
subroutine 10 10 100.0
pod 1 6 16.6
total 63 72 87.5


line stmt bran cond sub pod time code
1             package Bootylicious::Timestamp;
2              
3 19     19   61833 use strict;
  19         35  
  19         716  
4 19     19   86 use warnings;
  19         28  
  19         504  
5              
6 19     19   184 use base 'Mojo::Base';
  19         26  
  19         11367  
7              
8             require Time::Local;
9             require Time::Piece;
10              
11             __PACKAGE__->attr('epoch');
12              
13             my $TIMESTAMP_RE = qr/(\d\d\d\d)(\d?\d)(\d?\d)(?:T(\d\d):?(\d\d):?(\d\d))?/;
14              
15             sub new {
16 287     287 1 12723 my $self = shift->SUPER::new;
17 287         2044 my %params = @_;
18              
19 287 100       1053 if (exists $params{epoch}) {
20 206         542 $self->epoch($params{epoch});
21             }
22             else {
23 81         253 my $epoch = $self->_to_epoch($params{timestamp});
24 81         289 $self->epoch($epoch);
25             }
26              
27 287         2366 return $self;
28             }
29              
30             sub _to_epoch {
31 81     81   106 my $self = shift;
32 81         105 my $timestamp = shift;
33              
34 81 50       1579 return unless $timestamp =~ qr/^$TIMESTAMP_RE$/;
35              
36 81   100     1098 my ($year, $month, $day, $hour, $minute, $second) =
      100        
      100        
37             ($1, $2, $3, ($4 || 0), ($5 || 0), ($6 || 0));
38              
39 81         117 my $epoch = 0;
40 81         152 eval {
41 81         509 $epoch =
42             Time::Local::timegm($second, $minute, $hour, $day, $month - 1,
43             $year - 1900);
44             };
45              
46 81 50 33     3302 return if $@ || $epoch < 0;
47              
48 81         203 return $epoch;
49             }
50              
51             sub year {
52 47     47 0 847 my $self = shift;
53              
54 47         159 return Time::Piece->gmtime($self->epoch)->year;
55             }
56              
57             sub month {
58 39     39 0 429 my $self = shift;
59              
60 39         122 return Time::Piece->gmtime($self->epoch)->mon;
61             }
62              
63             sub timestamp {
64 11     11 0 626 my $self = shift;
65              
66 11         37 my $t = Time::Piece->gmtime($self->epoch);
67              
68 11         734 return $t->strftime('%Y%m%dT%H:%M:%S');
69             }
70              
71             sub strftime {
72 7     7 0 19 my $self = shift;
73 7         16 my $fmt = shift;
74              
75 7         40 my $t = Time::Piece->gmtime($self->epoch);
76              
77 7         1114 return $t->strftime($fmt);
78             }
79              
80             sub is_timestamp {
81 2     2 0 299 my $self = shift;
82 2         2 my $timestamp = shift;
83              
84 2 100       43 return $timestamp =~ qr/^$TIMESTAMP_RE$/ ? 1 : 0;
85             }
86              
87             1;