Как рассчитать разницу в DateTime в Perl? - PullRequest
5 голосов
/ 02 августа 2010
use DateTime ;

my $date = "2010-08-02 09:10:08";

my $dt = DateTime->now( time_zone => 'local' )->set_time_zone('floating');
print $dt->subtract_datetime($date);

Это не работает;в чем проблема?

Сообщение об ошибке:

Can't call method "time_zone" without a package or object reference at
/opt/perl/perl5.12/lib/site_perl/5.12.0/x86_64-linux/DateTime.pm line 1338

Ответы [ 3 ]

19 голосов
/ 02 августа 2010

Сначала необходимо преобразовать строки даты в объекты DateTime, используя настраиваемый формат или одна из множества доступных библиотек DateTime :: Format :: *. Вы используете формат, обычно используемый в базах данных, поэтому я выбрал MySQL форматер (а затем определил пользовательский форматер продолжительности для конечного результата, скопировано из примеров в DateTime :: Format :: Продолжительность ):

use DateTime;
use DateTime::Format::MySQL;
use DateTime::Format::Duration;

my $date = "2010-08-02 09:10:08";

my $dt1 = DateTime->now(time_zone => 'floating', formatter => 'DateTime::Format::MySQL');
my $dt2 = DateTime::Format::MySQL->parse_datetime($date);

my $duration = $dt1 - $dt2;
my $format = DateTime::Format::Duration->new(
    pattern => '%Y years, %m months, %e days, %H hours, %M minutes, %S seconds'
);
print $format->format_duration($duration);

# prints:
# 0 years, 00 months, 0 days, 00 hours, 421 minutes, 03 seconds
6 голосов
/ 02 августа 2010

$date должен быть DateTime объектом, а не простой строкой. Увидеть DateTime . И вы не можете просто напечатать возвращаемое значение subtract_datetime потому что возвращает ссылку. Вы должны использовать методы, такие как hours, для извлечения полезной информации.

use strict;
use warnings;
use DateTime;

my $dt2 = DateTime->new(
                       year   => 2010,
                       month  => 8,
                       day    => 2,
                       hour   => 9,
                       minute => 10,
                       second => 8,
                       time_zone => 'local',
                     );

my $dt1 = DateTime->now( time_zone => 'local' )->set_time_zone('floating');

my $dur = $dt1->subtract_datetime($dt2);
print 'hours = ', $dur->hours(), "\n";

__END__

hours = 2
4 голосов
/ 02 августа 2010

Ну, на первый взгляд, я думаю, что $dt->subtract_datetime(...) сработает, если вы вычтете два объекта даты и времени.

то есть: ваш $date должен быть датой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...