Я думаю, что Hook :: LexWrap излишне в этой ситуации. Такую простую функцию проще просто переопределить.
use DateTime;
my $offset;
BEGIN {
$offset = 24 * 60 * 60; # Pretend it's tomorrow
no warnings 'redefine';
sub DateTime::now
{
shift->from_epoch( epoch => ($offset + scalar time), @_ )
}
} # end BEGIN
Вы можете заменить my $offset
на our $offset
, если вам нужен доступ к $offset
извне файла, содержащего этот код.
Вы можете настроить $offset
в любое время, если хотите изменить представление DateTime о текущем времени во время выполнения.
Расчет $offset
, вероятно, должен быть более сложным, чем показано выше. Например, чтобы установить «текущее время» в абсолютное время:
my $want = DateTime->new(
year => 2009,
month => 9,
day => 14,
hour => 12,
minute => 0,
second => 0,
time_zone => 'America/Chicago',
);
my $current = DateTime->from_epoch(epoch => scalar time);
$offset = $want->subtract_datetime_absolute($current)->in_units('seconds');
Но вы, вероятно, хотите рассчитать фиксированное количество секунд, чтобы прибавить к текущему времени, чтобы после этого время нормально продвигалось. Проблема с использованием add( days => 1 );
в переопределенном методе now
заключается в том, что такие вещи, как изменения летнего времени, приводят к тому, что время прыгает в неправильное псевдо-время.