$ perl -MDate::Calc=Add_Delta_YM -E 'say "$_ : " . join "-", Add_Delta_YM( split("-", $_), 0,-1) for qw/2018-03-28 2018-03-29 2018-03-30 2018-03-31/' 2018-03-28 : 2018-2-28 2018-03-29 : 2018-2-28 2018-03-30 : 2018-2-28 2018-03-31 : 2018-2-28 $ perl -MTime::Piece -E 'do { $t = Time::Piece->strptime($_, "%Y-%m-%d"); say "$_ : " . $t->add_months(-1)->strftime("%Y-%m-%d") } for qw/2018-03-28 2018-03-29 2018-03-30 2018-03-31/' 2018-03-28 : 2018-02-28 2018-03-29 : 2018-03-01 2018-03-30 : 2018-03-02 2018-03-31 : 2018-03-03