Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我怎样才能得到昨天;perl中的日期?_Perl_Date - Fatal编程技术网

我怎样才能得到昨天;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()
函数(有一个bulitin
localtime()
函数,但是
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