2012-04-08 11 views
3

"2012-02-03 00:00:00"の形式の日付のあるperlの日付計算には助けが必要です。特に、日数を増やすのに使うことのできるツールがあり、それは月と年に正しく切り替わりますか?ありがとう。perl date計算書式の日付2012-02-03 00:00:00

答えて

8

DateTimeを参照してください。

#!/usr/bin/env perl 
use strict; use warnings; 

use DateTime; 

my $ts = '2012-02-03 00:00:00'; 
my ($y, $m, $d) = ($ts =~ /([0-9]{4})-([0-9]{2})-([0-9]{2})/); 
my $dt = DateTime->new(year => $y, month => $m, day => $d); 
$dt->add(months => 2, days => 3); 

print $dt->strftime('%Y-%m-%d %H:%M:%S'), "\n"; 

は、それは実際のDateTime :: Formatクラスを使用するには少しクリーナーだ、とあなたは自由のためのエラーチェックを取得します。

use DateTime::Format::Strptime qw(); 

my $format = DateTime::Format::Strptime->new(
    pattern => '%Y-%m-%d %H:%M:%S', 
    time_zone => 'local', 
    on_error => 'croak', 
); 

my $ts = '2012-02-03 00:00:00'; 
my $dt = $format->parse_datetime($ts); 
$dt->add(months => 2, days => 3); 
print $format->format_datetime($dt), "\n"; 
+0

を与えるまた、ダウン少しより多くのコードを削り取っするhttps://metacpan.org/module/DateTime::Format::MySQLで見ることができます。 – oalders

+2

さまざまな特定の形式に縛られるのではなく、私は[DateTime :: Format :: Strptime](http://search.cpan.org/dist/DateTime-Format-Strptime/)を参照してください。 – runrig

+1

Hope you don '私はStrptimeの例を追加しました。元のコードの出力も修正しました。日付と時刻の間に望ましくない「T」がありました。 – ikegami

1

Time::Pieceモジュールは、Perlのインストールの標準一部であり、おそらくあなたが必要なものをすべて行います。

このプログラムでは、あなたのサンプルの日付を使用し、2ヶ月と3日、さらに400日を追加します。値を表示する二つの別の方法は、これはPOSIX時間処理関数を使用して、コア内のすべての完全に可能である

use strict; 
use warnings; 

use Time::Piece; 
use Time::Seconds 'ONE_DAY'; 

my $format = '%Y-%m-%d %H:%M:%S'; 

my $dt = Time::Piece->strptime('2012-02-03 00:00:00', $format); 
$dt = $dt->add_months(2); 
$dt += 3 * ONE_DAY; 

print $dt->strftime($format), "\n"; 

$dt += 400 * ONE_DAY; 

printf "%s %s\n", $dt->ymd, $dt->hms; 

出力

2012-04-06 00:00:00 
2013-05-11 00:00:00 
+0

1日の秒数は一定ではないので、これは間違いないでしょう。 – ikegami

+0

@ikegamiこれは通常「定数」です:-) Time :: Pieceを使用して、その日までに切り捨てられた日から始まる日を追加/減算する場合、通常、半日を追加または減算するときに追加の半日を追加します結果をその日に引くと切り捨てる。 – runrig

1

を示しています。

標準POSIX::mktime関数はすでに非正規化された値に対応しており、範囲外の日数/月を修正することができます。さらに、POSIX::strftimeは、実際にはフォーマット前にこの値を呼び出しているため、正しく調整されます。

use POSIX qw(strftime mktime); 
use POSIX::strptime qw(strptime); 

my $format = "%Y-%m-%d %H:%M:%S"; 

my @t = strptime("2012-02-03 00:00:00", $format); 
@t = @t[0..5]; # Throw away wday and yday 

$t[3] += 3; # mday 
$t[4] += 2; # mon 

say strftime $format, @t; 

$t[3] += 400; # mday 

say strftime $format, @t; 

2012-04-06 00:00:00 
2013-05-11 00:00:00