web-dev-qa-db-ja.com

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

これを微調整して、現地時間を使用して昨日の日付を取得するにはどうすればよいですか?

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;
}

13
jdamae

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ソリューションの「指定されていない」文書化された動作に照らして、複数のプラットフォーム間で期待されるが保証されない結果をテストできない場合は、このアプローチの方が適している可能性があります。

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

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

23
daxim

現在の時刻から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";
18
Chas. Owens

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モジュールを使用することもできます。ただし、これはコアモジュールではありません。

6
mscha

ほとんどのユーザーが提案する解決策は間違っています!

localtime(time() - 24*60*60)

最悪できることは、1日= 86400秒と想定することです。

例:タイムゾーンはAmerica/New_York、日付はMon Apr 3 00:30:002006です。

timelocalは私たちに11440386

localtime(1144038600-86400)= 2006年4月1日土曜日23:30:00EST

おっと!

正しい唯一の解決策は、システム機能に値を正規化させることです

$prev_day = timelocal(0, 0, 0, $mday-1, $mon, $year);

または、日時フレームワークを(DateTime, Class::Date, etc) 同じことをする。

それでおしまい。

5
Pronin Oleg
localtime(time() - 24*60*60)
1
user3458