3

「2012-02-03 00:00:00」という形式の日付を使った perl での日付計算について、助けが必要です。特に、日を増やすだけで月と年に正しく切り替えるために使用できるツールはありますか? ありがとう。

4

3 に答える 3

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";
于 2012-04-09T00:01:29.467 に答える
1

POSIXこれはすべて、時間処理機能を使用してコア内で完全に可能です。

標準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
于 2012-04-15T15:20:05.587 に答える
1

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

このプログラムでは、サンプルの日付を使用して、2 か月と 3 日を追加し、さらに 400 日を追加します。値を表示する 2 つの代替方法を示します。

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
于 2012-04-09T01:59:14.887 に答える