Perl-DateTime模块-如何比较两个DateTime';s为24小时的时间间隔

Perl-DateTime模块-如何比较两个DateTime';s为24小时的时间间隔,perl,datetime,Perl,Datetime,我已将日期戳保存到数据库中: 2015-02-23T16:59:25 我有一个代表当前时间的新日期时间戳 2015-02-24T16:59:25 我需要将两者与DateTime进行比较,以检查24小时是否已经过去 #!/usr/bin/perl use strict; use DateTime; my $longenough; Testing123(); exit; sub Testing123{ my $yesterday = DateTime->now; $yesterday-

我已将日期戳保存到数据库中:

2015-02-23T16:59:25
我有一个代表当前时间的新日期时间戳

2015-02-24T16:59:25
我需要将两者与DateTime进行比较,以检查24小时是否已经过去

#!/usr/bin/perl
use strict;
use DateTime;

my $longenough;

Testing123();
exit;
sub Testing123{
my $yesterday = DateTime->now;
$yesterday->add( days => -1 ); 

 #This $yesterday time gets saved to my database.
 #For question purposes, I'll just pass it along instead of from db. 

CheckLapse($yesterday);

if ($longenough eq 'y'){ print qq~24 hours have passed<br />~; }
else{print qq~24 hours have not passed<br />~;}
}

sub CheckLapse{
$yesterday = shift;
my $now = DateTime->now;

# leftovers from many many hours of different attempts from my old bramaged drain

# my $elapse = $now - $yesterday;
# $now->subtract_duration( $yesterday ) ;
# $TimeLapse = $elapse->in_units('seconds'); #Left over from another try
# print "Elapsed time : ".$elapse->in_units('seconds')."m\n";

##  I need to compare the two times and pass $longenough y/n back:

if ($TimeLapse >= [24 hours whatever seconds minutes to do calc]){
$longenough = 'y';
}
else {$longenough = 'n';}
return $longenough;
}
exit;
#/usr/bin/perl
严格使用;
使用日期时间;
我的美元足够长;
测试123();
出口
次级测试123{
我的$昨天=日期时间->现在;
$Dayed->add(天=>-1);
#这段时间被保存到我的数据库中。
#出于提问的目的,我将只传递它,而不是从db传递。
支票失效(昨天);
如果($longtough eq'y'){print qq~24小时过去了
~;} 否则{打印qq~24小时未过
~;} } 次级检查失效{ $昨天=班次; my$now=日期时间->现在; #从我的旧排水沟里经过几个小时的不同尝试后留下的剩菜 #我的$过去=$现在-$昨天; #$now->减去持续时间(昨天); #$TimeLapse=$elapse->in_单位('seconds');#另一次尝试的剩余时间 #打印“经过的时间:”.$elapse->以_单位(“秒”)“m\n”; ##我需要比较两次,并将$y/n传递回: 如果($TimeLapse>=[24小时,秒,分钟,进行计算]){ $longtough='y'; } else{$longhough='n';} 返回$longtough; } 出口
我已经阅读了cpan DateTime文档,并尝试了所有方法,但显然没有找到正确的解决方案。 我只是不断地遇到错误,比如“没有包或对象引用就不能调用方法”yada-yada“


有人可以在这里教我吗?

您可以根据字符串构造DateTime对象,如下所示:

use DateTime::Format::Strptime qw( );

my $dt_format = DateTiFormat::Strptime->new(
   pattern   => '%Y-%m-%dT%H:%M:%S',
   time_zone => 'local',
   on_error  => 'croak',
);

my $dt = $dt_format->parse_datetime('2015-02-23T16:59:25');
use DateTime::Format::Strptime qw( );

my $dt_format = DateTime::Format::Strptime->new(
   pattern   => '%Y-%m-%dT%H:%M:%S',
   time_zone => 'local',
   on_error  => 'croak',
);

my $dt = $dt_format->parse_datetime('2015-02-23T16:59:25');
$dt->add( hours => 24 );
my $target_time = $dt->epoch;
然后,您可以检查它是否24小时运行,如下所示:

my $now = DateTime->now( time_zone => $dt->time_zone );
if  ($dt->clone->add( hours => 24 ) >= $now) {
   # It's been more than 24 hours.
   ...
}

现在,每当您检查24小时是否已经过去时,上面的内容都会做很多工作。如果重复执行此操作,可以使用以下方法减少工作量:

use DateTime::Format::Strptime qw( );

my $dt_format = DateTiFormat::Strptime->new(
   pattern   => '%Y-%m-%dT%H:%M:%S',
   time_zone => 'local',
   on_error  => 'croak',
);

my $dt = $dt_format->parse_datetime('2015-02-23T16:59:25');
use DateTime::Format::Strptime qw( );

my $dt_format = DateTime::Format::Strptime->new(
   pattern   => '%Y-%m-%dT%H:%M:%S',
   time_zone => 'local',
   on_error  => 'croak',
);

my $dt = $dt_format->parse_datetime('2015-02-23T16:59:25');
$dt->add( hours => 24 );
my $target_time = $dt->epoch;
然后检查,然后简化为

if  ($target_time >= time)
   # It's been more than 24 hours.
   ...
}


您可能希望
->add(days=>1)
(在下一个日历日的同一时间)而不是
->add(hours=>24)

您可以按照以下方式从字符串构造DateTime对象:

use DateTime::Format::Strptime qw( );

my $dt_format = DateTiFormat::Strptime->new(
   pattern   => '%Y-%m-%dT%H:%M:%S',
   time_zone => 'local',
   on_error  => 'croak',
);

my $dt = $dt_format->parse_datetime('2015-02-23T16:59:25');
use DateTime::Format::Strptime qw( );

my $dt_format = DateTime::Format::Strptime->new(
   pattern   => '%Y-%m-%dT%H:%M:%S',
   time_zone => 'local',
   on_error  => 'croak',
);

my $dt = $dt_format->parse_datetime('2015-02-23T16:59:25');
$dt->add( hours => 24 );
my $target_time = $dt->epoch;
然后,您可以检查它是否24小时运行,如下所示:

my $now = DateTime->now( time_zone => $dt->time_zone );
if  ($dt->clone->add( hours => 24 ) >= $now) {
   # It's been more than 24 hours.
   ...
}

现在,每当您检查24小时是否已经过去时,上面的内容都会做很多工作。如果重复执行此操作,可以使用以下方法减少工作量:

use DateTime::Format::Strptime qw( );

my $dt_format = DateTiFormat::Strptime->new(
   pattern   => '%Y-%m-%dT%H:%M:%S',
   time_zone => 'local',
   on_error  => 'croak',
);

my $dt = $dt_format->parse_datetime('2015-02-23T16:59:25');
use DateTime::Format::Strptime qw( );

my $dt_format = DateTime::Format::Strptime->new(
   pattern   => '%Y-%m-%dT%H:%M:%S',
   time_zone => 'local',
   on_error  => 'croak',
);

my $dt = $dt_format->parse_datetime('2015-02-23T16:59:25');
$dt->add( hours => 24 );
my $target_time = $dt->epoch;
然后检查,然后简化为

if  ($target_time >= time)
   # It's been more than 24 hours.
   ...
}

您可能需要添加(天=>1)(下一个日历日的同一时间)而不是添加(小时=>24)

该模块庞大而缓慢,是一个完整的工具箱,可以处理任何与日期时间相关的问题。是一个重量轻得多的核心模块(因此不需要安装),完全可以完成此任务

下面是使用
Time::Piece

use strict;
use warnings;
use 5.010;

use Time::Piece ();
use Time::Seconds 'ONE_DAY';

my ($t1, $t2) = qw/
  2015-02-23T16:59:25
  2015-02-24T16:59:25
/;

my $diff = delta_time($t1, $t2);

say $diff >= ONE_DAY ? 'over one day' : 'less than one day';

sub delta_time {
  my ($t1, $t2) = map Time::Piece->strptime($_, '%Y-%m-%dT%H:%M:%S'), @_;
  return $t2 > $t1 ? $t2 - $t1 : $t1 - $t2;
}
输出

over one day    
这个模块庞大而缓慢,是一个完整的工具箱,可以处理任何与日期时间相关的事情。是一个重量轻得多的核心模块(因此不需要安装),完全可以完成此任务

下面是使用
Time::Piece

use strict;
use warnings;
use 5.010;

use Time::Piece ();
use Time::Seconds 'ONE_DAY';

my ($t1, $t2) = qw/
  2015-02-23T16:59:25
  2015-02-24T16:59:25
/;

my $diff = delta_time($t1, $t2);

say $diff >= ONE_DAY ? 'over one day' : 'less than one day';

sub delta_time {
  my ($t1, $t2) = map Time::Piece->strptime($_, '%Y-%m-%dT%H:%M:%S'), @_;
  return $t2 > $t1 ? $t2 - $t1 : $t1 - $t2;
}
输出

over one day    


从现在开始减去24小时(就像您在Testing123中所做的那样),然后将其与值进行比较。你不需要计算这些值和现在的值之间的差异-你只需要计算出一个时间点,这就是你的截止点。试过了。我不知道如何比较它们。这就是我在这里的原因,在11个小时的尝试后,我完全没有挫败感。您确实需要在Perl程序的顶部使用警告,并正确地缩进它们,以便您以及其他阅读您的代码的人,“我能理解它是如何构造的。”@OldDogLearningNewPerlTricks:我不敢相信比较值真的那么难。我希望只要
就行了。也许您应该尝试一个非常简单的示例,只需将
DateTime->now
DateTime->now->add(days=>-1)
进行比较。只需从现在开始减去24小时(就像您在Testing123中所做的那样),然后将其与值进行比较。你不需要计算这些值和现在的值之间的差异-你只需要计算出一个时间点,这就是你的截止点。试过了。我不知道如何比较它们。这就是我在这里的原因,在11个小时的尝试后,我完全没有挫败感。您确实需要在Perl程序的顶部使用警告,并正确地缩进它们,以便您以及其他阅读您的代码的人,“我能理解它是如何构造的。”@OldDogLearningNewPerlTricks:我不敢相信比较值真的那么难。我希望只要
就行了。也许您应该尝试一个非常简单的示例,它只需要
DateTime->now
DateTime->now->add(days=>-1)
并对它们进行比较。现在就开始尝试。我真的把克隆弄糊涂了。
clone
防止
$dt1
add
更改。如果没有包或对象引用,则无法调用方法“时区”。是的,请使用严格和警告。昨天我在$dt的两次出现中都分配了$dt。这对我来说毫无意义。在这两次事件中,我昨天都将$dt改回$dt,没有任何区别。我甚至设置了$dt='2015-02-23T16:59:25';无济于事。(而不是移动)现在就试试这个。我真的把克隆弄糊涂了。
clone
防止
$dt1
add
更改。如果没有包或对象引用,则无法调用方法“时区”。是的,请使用严格和警告。昨天我在$dt的两次出现中都分配了$dt。这对我来说毫无意义。在这两次事件中,我昨天都将$dt改回$dt,没有任何区别。我甚至设置了$dt='2015-02-23T16:59:25';无济于事。(而不是转换)@ikegami With
Time::Seconds
,一天(也许很天真)总是24小时:“这些方法假设一天有24小时,一周有7天,一年有365.24225天,一年有12个月。”@OldDogLearningNewPerlTricks:我假设什么是