我将从文件中读取随机日期,我想从该日期减去 4 个月。我正在使用 Perl 编程,但我可以使用 bash 命令。
如果我有 2013 年 10 月 14 日,我会得到 2013 年 6 月 14 日。
非常感谢!
卡列姆
use DateTime::Format::Strptime qw( );
my $format = DateTime::Format::Strptime->new(
pattern => '%m/%d/%Y',
on_error => 'croak',
);
my $dt = $format->parse_datetime('10/14/2013');
$dt->subtract( months => 4 );
say $format->format_datetime($dt);
$ date '+%m/%d/%Y' --date='02/14/2013 4 month ago'
10/14/2012
CPAN 模块 Date::Manip非常适合这类事情。Date::Manip 非常强大,因为它可以理解工作日和节假日......并且可以解析任意日期字符串,例如“下周二”或“8 月的第三个周四”。
你应该试一试;我打赌你会发现它非常有用。
这是一个解决您当前问题的简短示例:
#!/usr/bin/perl
use Date::Manip;
my $d = new Date::Manip::Date("10/18/2013");
print $d->printf("%c"), "\n";
my $delta = new Date::Manip::Delta("4 months ago");
my $od = $d->calc($delta);
print $od->printf("%c"), "\n";
...这会产生以下输出:
Fri Oct 18 00:00:00 2013
Tue Jun 18 00:00:00 2013
谨防比其他月份拥有更多天数的月份!
这是一个例子,减去一个月会给你一个你可能没想到的答案
endOfMarch=$(date -d "2017-03-31")
today=$endOfMarch
echo $(date -d "$today -1 month" "+%Y-%m-%d")
2017-03-02
因为二月只有 28 天,减去一个月有效地创建了2017-02-31
显然不存在的日期,因此给你的额外天数溢出到三月2017-03-02
根据您要解决的问题,您可以可靠地计算n
几个月前的数据,方法是创建一个设置为当月第一天的日期变量,然后减去月份。
endOfMarch=$(date -d "2017-03-31")
today=$endOfMarch
firstDayOfMonth=$(date -d "$today" "+%Y-%m-01")
echo $(date -d "$firstDayOfMonth -1 month" "+%Y-%m-%d")
2017-02-01
因此,现在您有了正确的Month
日期(即减去 1 个月时的二月),然后您必须Day
根据您的用例确定将新日期设置为什么。
所以加/减月份并不像人们想象的那么简单