如何使用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;
}
〜
答案 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";