当前我使用以下日期获取今天日期。我需要使用此日期获取昨天日期。
my $today = `date "+%Y-%m-%d"`;
答案 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“保留”(本地)时间以及日期; today
是truncate
版。
答案 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);