| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package DateTime::Duration::Fuzzy; |
|
2
|
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
18514
|
use strict; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
30
|
|
|
4
|
1
|
|
|
1
|
|
774
|
use utf8; |
|
|
1
|
|
|
|
|
10
|
|
|
|
1
|
|
|
|
|
6
|
|
|
5
|
1
|
|
|
1
|
|
1316
|
use DateTime; |
|
|
1
|
|
|
|
|
160012
|
|
|
|
1
|
|
|
|
|
36
|
|
|
6
|
1
|
|
|
1
|
|
12
|
use Carp; |
|
|
1
|
|
|
|
|
1
|
|
|
|
1
|
|
|
|
|
74
|
|
|
7
|
1
|
|
|
1
|
|
5
|
use Exporter qw(import); |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
34
|
|
|
8
|
|
|
|
|
|
|
|
|
9
|
1
|
|
|
1
|
|
1048
|
use if $ENV{ARCH_64BIT}, 'integer'; |
|
|
1
|
|
|
|
|
9
|
|
|
|
1
|
|
|
|
|
6
|
|
|
10
|
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
our @EXPORT_OK = qw(time_ago); |
|
12
|
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
our $VERSION = '0.06'; |
|
14
|
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
my @ranges = ( |
|
16
|
|
|
|
|
|
|
[ -1, 'in the future' ], |
|
17
|
|
|
|
|
|
|
[ 60, 'just now' ], |
|
18
|
|
|
|
|
|
|
[ 900, 'a few minutes ago'], # 15*60 |
|
19
|
|
|
|
|
|
|
[ 3000, 'less than an hour ago'], # 50*60 |
|
20
|
|
|
|
|
|
|
[ 4500, 'about an hour ago'], # 75*60 |
|
21
|
|
|
|
|
|
|
[ 7200, 'more than an hour ago'], # 2*60*60 |
|
22
|
|
|
|
|
|
|
[ 21600, 'several hours ago'], # 6*60*60 |
|
23
|
|
|
|
|
|
|
[ 86400, 'today', sub { # 24*60*60 |
|
24
|
|
|
|
|
|
|
my $time = shift; |
|
25
|
|
|
|
|
|
|
my $now = shift; |
|
26
|
|
|
|
|
|
|
if ( $time->day < $now->day |
|
27
|
|
|
|
|
|
|
or $time->month < $now->month |
|
28
|
|
|
|
|
|
|
or $time->year < $now->year |
|
29
|
|
|
|
|
|
|
) { |
|
30
|
|
|
|
|
|
|
return 'yesterday' |
|
31
|
|
|
|
|
|
|
} |
|
32
|
|
|
|
|
|
|
if ($time->hour < 5) { |
|
33
|
|
|
|
|
|
|
return 'tonight' |
|
34
|
|
|
|
|
|
|
} |
|
35
|
|
|
|
|
|
|
if ($time->hour < 10) { |
|
36
|
|
|
|
|
|
|
return 'this morning' |
|
37
|
|
|
|
|
|
|
} |
|
38
|
|
|
|
|
|
|
if ($time->hour < 15) { |
|
39
|
|
|
|
|
|
|
return 'today' |
|
40
|
|
|
|
|
|
|
} |
|
41
|
|
|
|
|
|
|
if ($time->hour < 19) { |
|
42
|
|
|
|
|
|
|
return 'this afternoon' |
|
43
|
|
|
|
|
|
|
} |
|
44
|
|
|
|
|
|
|
return 'this evening' |
|
45
|
|
|
|
|
|
|
}], |
|
46
|
|
|
|
|
|
|
[ 172800, 'yesterday'], # 2*24*60*60 |
|
47
|
|
|
|
|
|
|
[ 604800, 'this week'], # 7*24*60*60 |
|
48
|
|
|
|
|
|
|
[ 1209600, 'last week'], # 2*7*24*60*60 |
|
49
|
|
|
|
|
|
|
[ 2678400, 'this month', sub { # 31*24*60*60 |
|
50
|
|
|
|
|
|
|
my $time = shift; |
|
51
|
|
|
|
|
|
|
my $now = shift; |
|
52
|
|
|
|
|
|
|
if ($time->year == $now->year and $time->month == $now->month) { |
|
53
|
|
|
|
|
|
|
return 'this month' |
|
54
|
|
|
|
|
|
|
} |
|
55
|
|
|
|
|
|
|
return 'last month' |
|
56
|
|
|
|
|
|
|
}], |
|
57
|
|
|
|
|
|
|
[ 5356800, 'last month'], # 2*31*24*60*60 |
|
58
|
|
|
|
|
|
|
[ 24105600, 'several months ago'], # 9*31*24*60*60 |
|
59
|
|
|
|
|
|
|
[ 31536000, 'about a year ago'], # 365*24*60*60 |
|
60
|
|
|
|
|
|
|
[ 34214400, 'last year'], # (365+31)*24*60*60 |
|
61
|
|
|
|
|
|
|
[ 63072000, 'more than a year ago'], # 2*365*24*60*60 |
|
62
|
|
|
|
|
|
|
[ 283824000, 'several years ago'], # 9*365*24*60*60 |
|
63
|
|
|
|
|
|
|
[ 315360000, 'about a decade ago'], # 10*365*24*60*60 |
|
64
|
|
|
|
|
|
|
[ 630720000, 'last decade'], # 20*365*24*60*60 |
|
65
|
|
|
|
|
|
|
[ 2838240000, 'several decades ago'], # 90*365*24*60*60 |
|
66
|
|
|
|
|
|
|
[ 3153600000, 'about a century ago'], # 100*365*24*60*60 |
|
67
|
|
|
|
|
|
|
[ 6307200000, 'last century'], # 200*365*24*60*60 |
|
68
|
|
|
|
|
|
|
[ 6622560000, 'more than a century ago'], # 210*365*24*60*60 |
|
69
|
|
|
|
|
|
|
[ 28382400000, 'several centuries ago'], # 900*365*24*60*60 |
|
70
|
|
|
|
|
|
|
[ 31536000000, 'about a millenium ago'], # 1000*365*24*60*60 |
|
71
|
|
|
|
|
|
|
[ 63072000000, 'more than a millenium ago'], # 2000*365*24*60*60 |
|
72
|
|
|
|
|
|
|
); |
|
73
|
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
sub time_ago { |
|
75
|
31
|
|
|
31
|
1
|
33654
|
my ($time, $now) = @_; |
|
76
|
|
|
|
|
|
|
|
|
77
|
31
|
50
|
33
|
|
|
224
|
if (not defined $time or not $time->isa('DateTime')) { |
|
78
|
0
|
|
|
|
|
0
|
croak('DateTime::Duration::Fuzzy::time_ago needs a DateTime object as first parameter') |
|
79
|
|
|
|
|
|
|
} |
|
80
|
31
|
50
|
|
|
|
74
|
if (not defined $now) { |
|
81
|
0
|
|
|
|
|
0
|
$now = DateTime->now(); |
|
82
|
|
|
|
|
|
|
} |
|
83
|
31
|
50
|
|
|
|
91
|
if (not $now->isa('DateTime')) { |
|
84
|
0
|
|
|
|
|
0
|
croak('Invalid second parameter provided to DateTime::Duration::Fuzzy::time_ago; it must be a DateTime object if provided') |
|
85
|
|
|
|
|
|
|
} |
|
86
|
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
# Use clones in UTC for safe date calculation |
|
88
|
31
|
|
|
|
|
89
|
my $now_clone = $now->clone->set_time_zone('UTC'); |
|
89
|
31
|
|
|
|
|
4011
|
my $time_clone = $time->clone->set_time_zone('UTC'); |
|
90
|
31
|
|
|
|
|
3614
|
my $dur = $now_clone->subtract_datetime_absolute( $time_clone )->in_units('seconds'); |
|
91
|
|
|
|
|
|
|
|
|
92
|
31
|
|
|
|
|
4207
|
foreach my $range ( @ranges ) { |
|
93
|
413
|
100
|
|
|
|
802
|
if ( $dur <= $range->[0] ) { |
|
94
|
30
|
100
|
|
|
|
71
|
if ( $range->[2] ) { |
|
95
|
6
|
|
|
|
|
18
|
return $range->[2]->( $time_clone, $now_clone ) |
|
96
|
|
|
|
|
|
|
} |
|
97
|
24
|
|
|
|
|
184
|
return $range->[1] |
|
98
|
|
|
|
|
|
|
} |
|
99
|
|
|
|
|
|
|
} |
|
100
|
|
|
|
|
|
|
|
|
101
|
1
|
|
|
|
|
7
|
return 'millenia ago' |
|
102
|
|
|
|
|
|
|
} |
|
103
|
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
1 |
|
105
|
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
__END__ |