13

localtime を使用して昨日の日付を取得するにはどうすればよいですか?

use strict;

sub spGetCurrentDateTime;
print spGetCurrentDateTime;

sub spGetCurrentDateTime {
my ($sec, $min, $hour, $mday, $mon, $year) = localtime();
my @abbr = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
my $currentDateTime = sprintf "%s %02d %4d", $abbr[$mon], $mday, $year+1900; #Returns => 'Aug 17 2010' 
return $currentDateTime;
}

4

8 に答える 8

24
use DateTime qw();
DateTime->now->subtract(days => 1); 

2 行目の式はオブジェクトを返しDateTimeます。

于 2010-08-17T22:26:30.093 に答える
18

現在の時刻から 1 日分の秒数を差し引くのは魅力的ですが、間違った答えが得られる場合があります (閏秒、DST、その他)。strftime(Perl 5コアモジュールで利用可能POSIX)にすべてを任せる方が簡単だと思います。

#!/usr/bin/perl

use strict;
use warnings;

use Time::Local;
use POSIX qw/strftime/;

#2010-03-15 02:00:00
my ($s, $min, $h, $d, $m, $y) = (0, 0, 0, 15, 2, 110);

my $time      = timelocal $s, $min, $h, $d, $m, $y;    
my $today     = strftime "%Y-%m-%d %T", localtime $time;
my $yesterday = strftime "%Y-%m-%d %T", $s, $min, $h, $d - 1, $m, $y;
my $oops      = strftime "%Y-%m-%d %T", localtime $time - 24*60*60;
print "$today -> $yesterday -> $oops\n";
于 2010-08-17T22:36:34.320 に答える
12

DST の問題は、現在の時刻の代わりに今日の正午から 3600 秒を取得することで回避できます。

#!/usr/bin/perl
use strict;
use warnings;
use Time::Local;

sub spGetYesterdaysDate;
print spGetYesterdaysDate;

sub spGetYesterdaysDate {
my ($sec, $min, $hour, $mday, $mon, $year) = localtime();
my $yesterday_midday=timelocal(0,0,12,$mday,$mon,$year) - 24*60*60;
($sec, $min, $hour, $mday, $mon, $year) = localtime($yesterday_midday);
my @abbr = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
my $YesterdaysDate = sprintf "%s %02d %4d", $abbr[$mon], $mday, $year+1900;
return $YesterdaysDate;
}

Chas によって提案された strftime ソリューションの「未指定」の文書化された動作に照らして、複数のプラットフォーム間で期待されるが保証されていない結果をテストできない場合、このアプローチが適している可能性があります。

于 2010-08-18T03:21:24.707 に答える
6

Time::Pieceを使用します。

use strict;
use warnings;
use 5.010;

# These are core modules in Perl 5.10 and newer
use Time::Piece;
use Time::Seconds;

my $yesterday = localtime() - ONE_DAY;
say $yesterday->strftime('%b %d %Y');

これは、夏時間の開始など、境界線上の特定のケースではうまくいかない可能性があることに注意してください。このような場合、次のバージョンは正しく動作します。

use strict;
use warnings;
use 5.010;

# These are core modules in Perl 5.10 and newer
use Time::Piece;
use Time::Seconds;

my $now = localtime();
my $yesterday = $now - ONE_HOUR*($now->hour + 12);
say $yesterday->strftime('%b %d %Y');

または、別の回答で説明されているように DateTime モジュールを使用できます。ただし、これはコア モジュールではありません。

于 2010-08-17T21:10:10.107 に答える
1
localtime(time() - 24*60*60)
于 2010-08-17T20:10:36.953 に答える
0

my $yesterday = time(); $yesterday = $yesterday - (24*60*60);

24 を 24 時間、60 を 60 分、60 を 60 秒に time()すると、実際のタイムスタンプが返され、24 60 60 を指定すると、正確に 1 日の秒が削除されます。 localtime($yesterday);

于 2021-11-19T16:55:06.507 に答える
-1
This is how I do it.

#!/usr/bin/perl

use POSIX qw(strftime);

$epoc = time();
$epoc = $epoc - 24 * 60 * 60;

$datestring = strftime "%F", localtime($epoc);

print "Yesterday's date is $datestring \n";
于 2014-07-02T14:38:07.597 に答える