use DateTime qw( ); { my $now = DateTime->now( time_zone => 'local' ); ( my $dt = $now->clone ) ->add( seconds => $ARGV[0] ); print format_duration($dt - $now), "\n"; } #### use DateTime::Duration qw( ); { my $secs = $ARGV[0]; my $dur = DateTime::Duration->new( days => int($secs/(24*60*60)), hours => int($secs/(60*60))%24, minutes => int($secs/60)%60, seconds => $secs%60, ); print format_duration($dur), "\n"; } #### sub human_list { my $last = pop; return @_ ? join(', ', @_) . " and $last" : $last; } my @units = ( [qw( day days )], [qw( hour hours )], [qw( minute minutes )], [qw( second seconds )], ); my @units_plural = map $_->[1], @units; sub format_duration { my ($dur) = @_; my %parts; @parts{@units_plural} = $dur->in_units(@units_plural); my @parts; for (@units) { my ($singular, $plural) = @$_; if ($parts{$plural} == 1) { push @parts, "1 $singular"; } elsif ($parts{$plural} >= 1) { push @parts, "$parts{$plural} $plural"; } } return @parts ? 'in ' . human_list(@parts) : 'now'; }