从bash或perl中的日期开始的几个月前

时间:2013-10-31 19:03:49

标签: perl bash date

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

如果我有10/14/2013,我将于2013年6月14日收到。

非常感谢!

卡雷姆

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

$ date '+%m/%d/%Y' --date='02/14/2013 4 month ago'
10/14/2012

答案 2 :(得分:1)

CPAN module Date::Manip对于这类事情是完美的。 Date :: Manip非常强大,因为它了解工作日和假期......并且可以解析任意日期字符串,如“下周二”或“8月的第3个星期四”。

你应该试一试;我打赌你会发现它非常有用。

以下是解决当前问题的简短示例:

#!/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

答案 3 :(得分: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(即2月减去1个月),然后你必须找出根据你的用例设置新日期的Day

因此,添加/减去月份并不像人们想象的那样直截了当