我将从文件中读取随机日期,我想从该日期开始减去4个月。我在Perl中编程,但我可以使用bash命令。
如果我有10/14/2013,我将于2013年6月14日收到。
非常感谢!
卡雷姆
答案 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
。
因此,添加/减去月份并不像人们想象的那样直截了当