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

Deb*_*ger 4 perl date

目前我使用下面的今天日期。我需要使用这个今天的日期..我怎么能得到呢?

my $today = `date "+%Y-%m-%d"`;
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 9

如果要昨天的日期:

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');
Run Code Online (Sandbox Code Playgroud)

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

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

请注意,->now( time_zone => 'local' )->set_time_zone('floating')->truncate( to => 'days' )它用来代替->today( time_zone => 'local' )解决此问题


如果要提前一天的时间:

use DateTime qw( );

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

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

例如,在纽约,2019年3月10日12:00:00,它将给出2019年3月9日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( hours => 24 )
      ->strftime('%Y-%m-%d %H:%M:%S');
Run Code Online (Sandbox Code Playgroud)

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

例如,在纽约,2019年3月10日12:00:00,它将给出2019年3月9日11:00:00。

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


zdi*_*dim 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
Run Code Online (Sandbox Code Playgroud)

或直接

my $yesterday = DateTime->today(time_zone => 'local')->add(days => -1);
Run Code Online (Sandbox Code Playgroud)

现在,这些对象几乎可以与日期时间相关联。

为了提取在问题的格式使用字符串$yesterday->ymd年月日的默认格式为%Y-%m-%d。实际上,可以使用strftime方法获得任意格式。


没有理由需要系统设施来完成这样的工作。更重要的是,该模块可满足各种奇怪的情况和需求,而且无与伦比。

例如:在某些日期时间,由于夏令时开始,某些时间段就不存在了。该文档提供了一个 2003-04-06 的示例,当时01:59:59“跳”到03:00:00,该小时消失了。该模块通过抛出错误来正确地尝试使用此类时间(不存在的时间)。

而且,如果您需要对日期进行任何处理,那么date甚至不能选择使用system的日期,因为您只能得到一个字符串,您必须手动对其进行解析以进行进一步的使用。


补充说,事实上,不仅是日期,还希望有时间。然后,例如

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
Run Code Online (Sandbox Code Playgroud)

其中,方法现在 “保持”(本地)时,按照日期进行(todaytruncate-ed now)。