如何使用localtime获取昨天的日期?

时间:2010-08-17 20:04:39

标签: perl localtime

如何使用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;
}

7 个答案:

答案 0 :(得分:22)

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

第二行上的表达式返回DateTime个对象。

答案 1 :(得分:18)

就像从当前时间减去一天的秒数一样诱人,有时候这会产生错误的答案(闰秒,夏令时,可能还有其他)。我发现让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";

答案 2 :(得分:12)

DST问题可以通过今天中午而不是当前时间从3600s开始解决:

#!/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解决方案的“未指定”记录行为,如果您无法跨多个平台测试预期但不保证的结果,则此方法可能会更好。

答案 3 :(得分: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模块,如另一个答案中所述。不过,这不是一个核心模块。

答案 4 :(得分:4)

大多数用户建议的解决方案是错误的!

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

您可以做的最差事情是假设 1天= 86400 秒。

示例:时区是America / New_York,日期是2006年4月3日00:30:00

timelocal 为我们提供 1144038600

  

localtime(1144038600 - 86400)= Sat Apr 1 23:30:00 EST 2006

糟糕!

正确和唯一的解决方案是让系统功能标准化值

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

或者让datetime框架(DateTime, Class::Date, etc)执行相同的操作。

就是这样。

答案 5 :(得分:1)

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

答案 6 :(得分:-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";