如何在Perl中获取昨天的日期?

时间:2019-05-14 02:52:21

标签: perl date

当前我使用以下日期获取今天日期。我需要使用此日期获取昨天日期。

my $today = `date "+%Y-%m-%d"`;

6 个答案:

答案 0 :(得分:9)

如果要昨天的日期:

radiogroup.check(radioButtonId)

例如,在纽约,时间为2019-05-14 01:00:00,它将为2019-05-13。

例如,在纽约,它将在2019-11-04 00:00:00给出2019-11-03。

请注意,使用use DateTime qw( ); my $yday_date = DateTime ->now( time_zone => 'local' ) ->set_time_zone('floating') ->truncate( to => 'days' ) ->subtract( days => 1 ) ->strftime('%Y-%m-%d'); 而非->now( time_zone => 'local' )->set_time_zone('floating')->truncate( to => 'days' )来解决this problem


如果您希望提前一天的时间:

->today( time_zone => 'local' )

例如,在纽约,时间为2019-05-14 01:00:00,它将为2019-05-13 01:00:00。

例如,在纽约,它将在2019-03-10 12:00:00给出2019-03-09 12:00:00。

例如,在纽约,于2019-03-11 02:30:00,它将给出错误。 (2019-03-10 02:30:00因为切换到夏令时而不存在。)


如果您希望时间早24小时:

use DateTime qw( );

my $yday_datetime =
   DateTime
      ->now( time_zone => 'local' )
      ->subtract( days => 1 )
      ->strftime('%Y-%m-%d %H:%M:%S');

例如,在纽约,时间为2019-05-14 01:00:00,它将为2019-05-13 01:00:00。

例如,在纽约,时间为2019-03-10 12:00:00,它将为2019-03-09 11:00:00。

例如,在纽约,时间为2019-03-11 02:30:00,它将为2019-03-10 01:30:00。

答案 1 :(得分:7)

使用DateTime模块

use strict;
use warnings;
use feature 'say';

use DateTime;

my $today = DateTime->today(time_zone => 'local');

my $yesterday = $today->clone->add(days => -1);

say $yesterday->ymd;  #--> 2019-05-13

或直接

my $yesterday = DateTime->today(time_zone => 'local')->add(days => -1);

现在这些都是对象,您几乎可以使用它们与日期时间相关的任何事情。

要提取问题格式的字符串,请使用$yesterday->ymd,因为ymd的默认格式为%Y-%m-%d。可以使用strftime方法获得几乎任意格式。


没有理由为这样的工作寻求系统设施。更重要的是,该模块可满足各种奇怪的情况和需求,因此无比复杂和全面。

一个例子:在某些日期时间,由于夏令时在某些时间段内生效,因此不存在;是2003年4月6日的文档offer an example,当时01:59:59“跳到” 03:00:00,那一小时消失了。该模块通过抛出错误来正确地处理尝试使用此类时间(不存在的时间)的情况。

如果您需要对日期进行任何处理,那么甚至不能选择使用系统的date,因为您只会得到一个字符串,您必须手动对其进行解析才能进一步使用。< / p>


已经解释了,事实上,不仅是日期,还需要时间。然后,例如

my $today = DateTime->now(time_zone => 'local');

say $today->strftime("%Y%m%d_%H.%M.%S");         #--> 20190522_22.44.23

my $yesterday = $today->clone->add(days => -1);

say $yesterday->strftime("%Y%m%d_%H.%M.%S");     #--> 20190521_22.44.23

where方法now“保留”(本地)时间以及日期; todaytruncate版。

答案 2 :(得分:4)

我建议使用DateTime(如ikegami的答案中所述)。但是,如果您不想安装CPAN模块,则此方法仅使用标准Perl安装中可用的功能。

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

use Time::Local;
use POSIX 'strftime';

# Get the current date/time
my ($sec, $min, $hr, $day, $mon, $yr) = localtime;

# Get the epoch seconds for midday today
# (we use midday to eliminate potential problems
# when entering or leaving daylight savings time)
my $midday = timelocal(0, 0, 12, $day, $mon, $yr);

# Subtract a day's worth of seconds from the epoch
my $midday_yesterday = $midday - (24 * 60 * 60);

# Convert that epoch value to a string date using
# localtime() and POSIX::strftime().
my $yesterday = strftime('%Y%m%d', localtime($midday_yesterday));

say $yesterday;

答案 3 :(得分:2)

使用Time::Moment,仅用于昨天的日期:

use strict;
use warnings;
use Time::Moment;
my $yesterday = Time::Moment->now->minus_days(1)->strftime('%Y-%m-%d');

Time :: Moment仅适用于即时和偏移量,而不适用于时区,因此,如DateTime示例中所示,如果要在本地时区中使用“一天前”的确切日期和时间,则可以使用{{3} }。

use strict;
use warnings;
use Time::Moment;
use Role::Tiny ();
my $class = Role::Tiny->create_class_with_roles('Time::Moment', 'Time::Moment::Role::TimeZone');
my $yesterday = $class->now->minus_days(1)->with_system_offset_same_local; # 1 day ago
my $yesterday = $class->now->minus_days(1)->with_system_offset_same_instant; # 24 hours ago

如果当前时间在本地时区的前一天不存在,同样的警告也适用。

答案 4 :(得分:1)

my $yesterday = `date -d yesterday +%Y%m%d-%H%M%S`;

答案 5 :(得分:1)

使用反引号字符串有一些奇怪之处。...我通常使用类似磁盘的运算符。

让我建议使用localtime()模块提供的Time::Piece函数(有一个bulitin localtime()函数,但是Time::Piece中的一个是awesomer:)


use Time::Piece;

my ($t, $today, $yesterday);

$t = localtime();
$today = sprintf('%04d/%02d/%02d', $t->year, $t->mon, $t->mday);

$t = localtime(time() - 86400);
$yesterday = sprintf('%04d/%02d/%02d', $t->year, $t->mon, $t->mday);