#!/usr/bin/perl -w use strict; use Date::Calc qw(Delta_DHMS Time_to_Date Delta_Days); use Date::Manip; use Benchmark qw(:all); use Data::Dumper::Simple; require "tools.pl"; # Contains connectdb() sub my $dbh = connectdb(); my @secs = qw(-2147483648 -1 0 1 86399 86400 2147483648); my %contenders = ( cw_silly => { code => \&sec_to_dhms_silly }, cw_sensible => { code => \&sec_to_dhms_sensible }, McDarren => { code => \&sec_to_dhms_McDarren }, Tanktalus => { code => \&sec_to_dhms_Tanktalus }, gam3 => { code => \&sec_to_dhms_gam3 }, gloryhack => { code => \&sec_to_dhms_gloryhack }, GrandFather => { code => \&sec_to_dhms_GrandFather }, davidrw => { code => \&sec_to_dhms_davidrw }, snowhare => { code => \&sec_to_dhms_snowhare }, ); for my $s (@secs) { foreach my $c (keys %contenders) { my @res; eval { @res = $contenders{$c}{code}->($s); }; $contenders{$c}{$s} = defined @_ ? "@_" : "@res"; } } print Dumper(%contenders); our $data = 1000; cmpthese -10, { cw_silly => 'my $res = sec_to_dhms_silly($data)', cw_sensible => 'my $res = sec_to_dhms_sensible($data)', McDarren => 'my $res = sec_to_dhms_McDarren($data)', Tanktalus => 'my $res = sec_to_dhms_Tanktalus($data)', gam3 => 'my $res = sec_to_dhms_gam3($data)', gloryhack => 'my $res = sec_to_dhms_gloryhack($data)', GrandFather => 'my $res = sec_to_dhms_GrandFather($data)', davidrw => 'my $res = sec_to_dhms_davidrw($data)', snowhare => 'my $res = sec_to_dhms_snowhare($data)', }; $dbh->disconnect; sub sec_to_dhms_silly { my @epoch = (1970, 1, 1, 0,0,0); my @mytime = gmtime(shift); splice (@mytime, 6); # discard fields after 6th element (year) $mytime[5] += 1900; # gmtime returns year - 1900 $mytime[4]++; # gmtime has zero based month @mytime = reverse @mytime; # Delta_DHMS expects args in reverse to gmtime return Delta_DHMS(@epoch, @mytime); } sub sec_to_dhms_sensible { shift; my ($d, $h, $m, $s); $s = $_ % 60; $_ = ($_ - $s) / 60; $m = $_ % 60; $_ = ($_ - $m) / 60; $h = $_ % 24; $_ = ($_ - $h) / 24; $d = $_; return ($d, $h, $m, $s); } sub sec_to_dhms_McDarren { my $t = shift; return $dbh->selectrow_array("SELECT sec_to_time($t);"); } sub sec_to_dhms_Tanktalus { use integer; local $_ = shift; my ($d, $h, $m, $s); $s = $_ % 60; $_ /= 60; $m = $_ % 60; $_ /= 60; $h = $_ % 24; $_ /= 24; $d = $_; return ($d, $h, $m, $s); } sub sec_to_dhms_gam3 { my $t = shift; return int($t / 86400), (gmtime($t))[2, 1, 0]; } sub sec_to_dhms_gloryhack { my $t = shift; return sprintf("%s%02d:%02d:%02d:%02d", $t < 0 ? '-' : '', Delta_DHMS(Time_to_Date(0), Time_to_Date(abs($t)))); } sub sec_to_dhms_GrandFather { my $t = shift; my @fields = ($t % 60, ($t /= 60) % 60, ($t /= 60) % 24, int ($t / 24)); return join ':', reverse @fields; } sub sec_to_dhms_davidrw { my $t = shift; return join ":", map { sprintf "%02d", $t } do { my @d = Time_to_Date($t); ( Delta_Days((Time_to_Date(0))[0..2], @d[0..2]), @d[3..5] ) }; } sub sec_to_dhms_snowhare { my $t = shift; return Delta_Format("+${t}seconds",'exact','%dh','%hv','%mv','%sv'); }