我怎样才能得到昨天;perl中的日期?
目前我使用下面的日期获取今天的日期。我需要使用此获取昨天的日期。。我怎么能得到这个我怎样才能得到昨天;perl中的日期?,perl,date,Perl,Date,目前我使用下面的日期获取今天的日期。我需要使用此获取昨天的日期。。我怎么能得到这个 my $today = `date "+%Y-%m-%d"`; 使用模块 或者直接 my $yesterday = DateTime->today(time_zone => 'local')->add(days => -1); 现在,这些对象实际上可以执行任何与日期时间相关的操作 要提取问题格式的字符串,请使用$dayed->ymd,因为问题的默认格式是%Y-%m-%d。实际上,使用该
my $today = `date "+%Y-%m-%d"`;
使用模块
或者直接
my $yesterday = DateTime->today(time_zone => 'local')->add(days => -1);
现在,这些对象实际上可以执行任何与日期时间相关的操作
要提取问题格式的字符串,请使用$dayed->ymd
,因为问题的默认格式是%Y-%m-%d
。实际上,使用该方法可以获得任意格式
对于这样的工作,没有理由使用系统设施。更重要的是,该模块是无与伦比的更加复杂和全面,为各种奇怪的情况和需要 例如:在某些日期时间,随着夏令时的到来,某些时间段根本不存在。2003-04-06的文件,当01:59:59“跳”到03:00:00时,那个小时已经过去了。模块通过抛出错误来处理正确使用此类(不存在的时间)的尝试 如果您需要对日期进行任何处理,那么使用系统的
date
甚至不是一个选项,因为您只返回一个字符串,您必须手动解析该字符串以供进一步使用
有人补充说,事实上,时间也是需要的,而不仅仅是日期。那么比如说
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
其中方法“保留”了(本地)时间和日期(
今天
是截断
-ed现在
)。使用反勾选字符串有一些怪癖。。。。我通常喜欢那个接线员
让我推荐使用Time::Piece
模块提供的localtime()
函数(有一个bulitinlocaltime()
函数,但是Time::Piece
中的函数是一个
如果您想要昨天的日期:
use DateTime qw( );
my $yday_date =
DateTime
->now( time_zone => 'local' )
->set_time_zone('floating')
->truncate( to => 'day' )
->subtract( days => 1 )
->strftime('%Y-%m-%d');
use strict;
use warnings;
use Time::Moment;
my $yesterday = Time::Moment->now->minus_days(1)->strftime('%Y-%m-%d');
例如,在纽约2019-05-14的01:00:00,它将返回2019-05-13
例如,在纽约2019-11-04的00:00:00,它将返回2019-11-03
请注意,现在使用->(时区=>'local')->设置时区('floating')->截断(to=>'day')
而不是今天使用->(时区=>'local')
以避免
如果您希望时间提前一天:
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的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');
例如,在纽约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。我建议使用DateTime(如池上的回答所述)。但是,如果您不想安装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;
仅就昨天的日期而言:
use DateTime qw( );
my $yday_date =
DateTime
->now( time_zone => 'local' )
->set_time_zone('floating')
->truncate( to => 'day' )
->subtract( days => 1 )
->strftime('%Y-%m-%d');
use strict;
use warnings;
use Time::Moment;
my $yesterday = Time::Moment->now->minus_days(1)->strftime('%Y-%m-%d');
Time::Moment在瞬间和偏移量中工作,而不是在时区中,因此,如果您希望在本地时区中获得“一天前”的确切日期和时间,如DateTime示例中所示,可以使用
如果当前时间在本地时区的前一天不存在,同样的警告也适用。感谢您的帮助,因此如果我需要前天的帮助,我可以添加-2d?date-d-2days+%Y%m%d这并不总是有效。它有时会给出一个一小时的休息时间。(例如,对于纽约的
20190310-120000
,它给出了20190309-110000
)对于这样简单的事情使用外部程序不是一个好主意。它降低了代码的可移植性,并使其不必要地变慢。。。你们真的还需要时间吗,还是仅仅是约会?事实上,@heydo-answer对我很有效。但是,我使用上面的方法使用时间戳创建目录。但是我用\n获得它。ed:-2019-05-14\n但我没有通过任何输入。。你知道这是什么原因吗?“但我明白了”\n.“--反勾号返回该值;你需要咀嚼事实上我想要今天和昨天。所以我用上面的今天,现在我可以用昨天用今天作为@Heyddo的答案,对于不存在的时间(例如,纽约2019-03-10T02:30:00之前的一天),你想要什么输出?注意:对于不存在的时间(纽约2019-03-10T02:30之前的一天),这个(正确的)失败。如果你只想知道日期(而不是时间),那么你可以使用->set\u time\u zone('floating')
来阻止它失败。@zdim只是我很好奇。是否可以运行一次并使用它获得天数?例如:-使用datetime i take today(YYYY-MM-DD-HH-MM-SS)使用today我可以在昨天或前X天使用而不每次运行吗?@Debugger如果我得到您想要的,这将是答案中的第二种方式(“或直接”)?比如,my$d\u N\u back=DateTime->today(时区=>“本地”)->add(天数=>-$N)
(其中$N
有编号)。现在这是一个可以使用的对象。如果您希望返回一个就绪字符串,请继续该链:my$str=DateTime->[如上]->ymd代码>。或者,对于更具体的格式,->strftime(…)
。这就是你的意思吗?@Debugger当我再次阅读时,我不明白“每次都不运行”。。。?一旦你有了其中的一个,你可以在一句话中从中得到其他任何一天——这就是你想要的“利用今天,我能在昨天或X天前得到什么”吗?比如$N\u back=$today->clone->add(days=>-$N)代码>。在这里,clone
从$today
创建另一个对象,因此您可以保留$today
,并在$N
前几天获得一个新对象。或者,要获取字符串,$N\u back\u str=$today->clone->add(days=>-$N)->ymd代码>@zdim就是这个东西。我是cr
use strict;
use warnings;
use Time::Moment;
my $yesterday = Time::Moment->now->minus_days(1)->strftime('%Y-%m-%d');
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