0

私の perl プログラムでは、保証終了日から保証開始日を計算しています。差は 3 年です。以下は、これまでに作成したコードのチャンクです。

use Time::ParseDate;
use DateTime;
use POSIX;
use DateTime::Duration;

my $warranty_expiration_string = "20-May-07";
my $epoch = parsedate($warranty_expiration_string);
my $warranty_expiration = strftime "%D", localtime($epoch);   # returns: 05/20/07

日付$warranty_expirationを取得するために3 年を差し引くにはどうすればよいですか? 私は試した、$warranty_start

$warranty_start->subtract(DateTime::Duration->new('years' => 3));

..しかし、うまくいきませんでした。

4

3 に答える 3

5

さまざまな日付/時刻モジュールが混在していることを理解していません。それらのすべてではなく、それらの一部のみが必要です。とにかくDateTimeを使用して日付計算を行いたい場合は、次のようなものが必要です。

use DateTime;
use DateTime::Format::Strptime;

my $dateparser = DateTime::Format::Strptime->new( pattern => '%d-%b-%y' );

my $warranty_expiration = $dateparser->parse_datetime($warranty_expiration_string);
my $warranty_start      = $warranty_expiration->clone->subtract( years => 3);

DateTime::Format::* モジュールのほとんどは、DateTime で使用することを意図しており、可能であればそれらを使用することを好みます。

また、現在進行中の DateTime プロジェクトと推奨モジュールのリストについては、次の URL を参照してください。

于 2012-08-30T14:48:06.103 に答える
2

$warranty_expirationDateTime ではなく、文字列です。次のようなことをしたい:

my $warranty_expiration = DateTime->from_epoch(
    epoch => $epoch,
    time_zone => 'local',
);
my $warranty_start = $warranty_expiration->clone->subtract(years => 3);

そして、書式設定された文字列として$warranty_expiration->strftime("%D")andを使用できます。$warranty_start->strftime("%D")また、 のDateTime::Format代わりにモジュールの 1 つを使用すると、 を使用する代わりに、パーサーから直接Time::ParseDateが返されます。DateTimefrom_epoch

于 2012-08-30T14:38:30.743 に答える
-1

DateTime::Duration計算メソッドはこれらのパラメーターを直接想定しているため、これをインスタンス化する必要はありません。

use DateTime;
my $dt = DateTime->now->subtract(years => 3);
print "$dt\n";

結果:

2009-08-30T14:36:27
于 2012-08-30T14:37:17.500 に答える