sub dhm { my $time = shift; my (@times, @time); my @format = qw(m h d); push @times, ($time / 60) % 60; # Minutes push @times, ($time / (60 * 60)) % 24; # Hours push @times, int($time / (24 * 60 * 60)); # Days for my $i (0 .. $#times) { push @time, "$times[$i]\cB$format[$i]\cB" if $times[$i] > 0; } return join ' ', reverse @time; } sub time2string { my %defaults = ( long_format => 1, spacing => 1, bold => 0 ); my $time = shift; my %args = (%defaults, @_); my @format; if ($args{format}) { $args{long_format} = 1; @format = split ' ', $args{format}; } if (@format) { die "error: format needs excatly 7 values.\n" unless $#format == 6; } else { if ($args{long_format} == 1) { @format = qw(sec min hour day week month year); } elsif ($args{long_format} == 2) { @format = qw(second minute hour day week month year); } elsif (!$args{format} && !$args{long_format}) { @format = qw(s m h d w mo y); } } die "error: time must only only be digits.\n" if !defined $time || $time !~ /^\-?\d+$/; my $prefix = ''; if ($time < 0) { $time = - $time; $prefix = "- "; } my (@times, @data); push @times, $time % 60; # Seconds push @times, ($time / 60) % 60; # Minutes push @times, ($time / (60 * 60)) % 24; # Hours push @times, int($time / (24 * 60 * 60)); # Days my $modulo = sub { my ($days, $d) = @_; my $return; if ($d >= $days) { $return = int($d / $days); $d = $d % $days; } else { $return = 0; } return $return, $d; }; ($times[6], $times[3]) = $modulo->(365, $times[3]); # Years ($times[5], $times[3]) = $modulo->(30, $times[3]); # Months ($times[4], $times[3]) = $modulo->(7, $times[3]); # Weeks $time = defined $prefix ? $prefix : undef; for my $i (reverse 0 .. $#times) { next if $times[$i] == 0; $format[$i] .= $times[$i] > 1 && $args{long_format} && !$args{format} ? 's ' : ' '; $time .= $args{spacing} ? "$times[$i] $format[$i]" : "$times[$i]$format[$i]"; } $time =~ s#([A-Z]+)#\cB$1\cB#ig if $args{bold} == 1; return $time; }