13

如何调整它以使用本地时间获取昨天的日期?

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

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

于 2010-08-17T22:26:30.093 回答
18

尽管从当前时间中减去一天的秒数很诱人,但有时这会产生错误的答案(闰秒、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

可以通过从今天中午而不是当前时间取 3600 秒来解决 DST 问题:

#!/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 回答
5

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

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

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

示例:时区是 America/New_York,日期是 Mon Apr 3 00:30:00 2006

timelocal给我们1144038600

当地时间(1144038600 - 86400)= 2006 年 4 月 1 日星期六 23:30:00 EST

哎呀!

正确且唯一的解决方案是让系统函数标准化值

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

或者让日期时间框架(DateTime, Class::Date, etc)也这样做。

就是这样。

于 2013-12-18T19:43:15.010 回答
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 将删除恰好一天的秒数之后只需执行以下操作: 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 回答