I recently needed to subtract 1 month from a date for a perl program I was working on. Whilst subtracting days or weeks is easy as you can just convert it to a timestamp, adjusting months or years is far harder due to all the complexity of having to deal with different numbers of days in months, leap years, etc.
Took me a little while to find the best function to use, but there is a perl module that can do this for you called Date::Calc, which provides a function called Add_Delta_YM.
This function will handle all the complexity, and will round to the closet date in the previous month, handling situations like “2007-03-31 – 1 month == 2007-02-28” in a nice fashion.
Below is a code sample:
#!/usr/bin/perl use strict; use Date::Calc qw(:all); my $year = "2007"; my $month = "3"; my $day = "31"; my $Dy = "0"; # number of years to adjust by my $Dm = "-1"; # number of months to adjust by (-1 means go back 1 month) ($year,$month,$day) = Add_Delta_YM($year,$month,$day, $Dy,$Dm); print "$year-$month-$day\n";
If you need to do any other type of date manipulation, I suggest you look into the Date::Calc module to see if it fulfills your needs. As an added plus, if your a RHEL/CentOS user the module is available in the base repository.