2013-10-31 57 views
1

我將從文件中讀取隨機日期,我想從該日期開始減少4個月。我在Perl編程,但我可以使用bash命令。月前從bash或perl給定日期的日期開始

如果我有10/14/2013我會得到06/14/2013。

非常感謝!

卡里姆

+0

https://metacpan.org/pod/Date::Simple – toolic

+0

我已經做了我與UnixDate過去的工作,但我試圖找到我所做的,但沒有得到任何積極的結果在谷歌。 – Karem

+0

非常感謝您的幫助 – Karem

回答

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); 
2
$ date '+%m/%d/%Y' --date='02/14/2013 4 month ago' 
10/14/2012 
+0

適用於Linux系統,但不適用於FreeBSD系統。 –

+0

@SlavenRezic爲了準確,這可以在'GNU Coreutils'的'date'中使用。 – devnull

1

CPAN module 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 
0

要注意的是有更多的天他們比其他幾個月的!

這裏就是1個月減去給你,你可能沒想到

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新的日期設置爲根據您的使用情況。

所以加法/減法月是不是直線前進的人們可能會認爲

相關問題