1

我将从文件中读取随机日期,我想从该日期减去 4 个月。我正在使用 Perl 编程,但我可以使用 bash 命令。

如果我有 2013 年 10 月 14 日,我会得到 2013 年 6 月 14 日。

非常感谢!

卡列姆

4

4 回答 4

3
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);
于 2013-10-31T19:26:18.390 回答
2
$ date '+%m/%d/%Y' --date='02/14/2013 4 month ago'
10/14/2012
于 2013-10-31T19:26:50.143 回答
1

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
于 2013-11-01T13:59:32.473 回答
0

谨防比其他月份拥有更多天数的月份!

这是一个例子,减去一个月会给你一个你可能没想到的答案

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根据您的用例确定将新日期设置为什么。

所以加/减月份并不像人们想象的那么简单

于 2017-02-02T20:41:07.753 回答