# Always use gmtime and timegm when
# dealing with dates without times.
use Time::Local qw( timegm );
# Replace with your input.
my $then_date_str = 'YYYYMMDD';
my $then_date = do {
my ($y, $m, $d) = $then_date_str =~ /^(.{4})(.{2})(.{2})\z/;
$m--;
timegm(0, 0, 0, $d, $m, $y)
};
my $now_date = do {
my ($y, $m, $d) = (localtime())[5,4,3];
timegm(0, 0, 0, $d, $m, $y)
};
my $diff = $now_date - $then_date;
my $diff_days = int($diff / (24*60*60));
if ($diff_days < -1) { printf("%d days ago\n", -$diff_days); }
elsif ($diff_days == -1) { print("yesterday\n"); }
elsif ($diff_days == 1) { print("tomorrow\n"); }
elsif ($diff_days > 1) { printf("%d days from now\n", $diff_days); }
else { print("today\n"); }
Notes:
- Time::Local is a core module.
- I advise against this method. Use Date::Calc.
- It only supports dates time can return.
Update: Oops, I was subtracting from $m twice. Fixed.