<%init> use strict; use warnings; BEGIN { push @INC,'/home/rendler/www/lib' }; use JSON; use CGI qw(:standard); use POSIX qw(strftime); use Date::Parse qw(str2time); use WWWDBI; my $www = WWWDBI->new(); my $dob = $www->dob(); my %entries = ( time => strftime('%A %d %B %Y %H:%M:%S %Z', localtime), andrea => howOld($dob->{andrea}->{dob}), nicky => howOld($dob->{nicky}->{dob}) ); $r->content_type('application/json'); print JSON->new->encode(\%entries); sub howOld { my $dob = str2time($_[0]); my $now = str2time(strftime("%Y:%m:%d %H:%M:%S%z", localtime)); my ($days, $weeks, $months, $years, $remain) = (0)x5; my $diff = $now - $dob; $days = $diff / 86400000 * 1000; $weeks = $days / 7; $months = $days / 30.4375; $years = $days / 365.24; $remain = ($days - int($years) * 365.24) / 30.4375; $days = rUp ($days * 10 / 10); $weeks = $weeks * 10 / 10; $months = $months * 10 / 10; $remain = $remain * 10 / 10; my @text; if ($years >= 1) { push @text, sprintf "%i %s", $years, ($years >= 2 ? 'years' : 'Year'); if ($remain >= 1) { push @text, sprintf "and %i %s", $remain, ($remain >= 2 ? 'months' : 'month'); } } elsif ($months >= 1) { push @text, sprintf "and %i %s", $months, ($months >= 2 ? "months" : "month"), $months; } elsif ($days >= 0) { push @text, sprintf "and %i %s", $days, ($days >= 2 ? "days" : "day"), $days; } return join ' ', @text, " old. Which was $diff seconds ago.\n"; } sub rUp { my $n = shift; return(($n == int($n)) ? $n : int($n + 1)) }