Perl-модуль для анализа спецификаций продолжительности времени на естественном языке (аналогично команде at)?

Я пишу perl-скрипт, который принимает параметр «длительность», и я хотел бы иметь возможность указать эту продолжительность довольно гибким образом, а не использовать только одну единицу (например, количество секунд). Команда UNIX at реализует такое поведение, допуская такие спецификации, как «сейчас + 3 часа + 2 дня». Для моей программы подразумевается часть «сейчас», поэтому я просто хочу проанализировать материал после знака «плюс». (Примечание: команда at также анализирует точные спецификации даты, но я хочу анализировать только продолжительность.)

Есть ли модуль perl для синтаксического анализа спецификаций продолжительности, подобных этому? Мне не нужен точный синтаксис, принятый at, достаточно любого разумного синтаксиса для указания длительности времени.


Изменить: в принципе, я хочу что-то вроде DateTime::Format::Flexible для длительности вместо дат.


person Ryan C. Thompson    schedule 04.06.2010    source источник


Ответы (3)


Взгляните на DateTime::Duration и DateTime::Format::Duration:

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

my $formatter = DateTime::Format::Duration->new(
        pattern => '%e days, %H hours'
);

my $dur = $formatter->parse_duration('2 days, 5 hours');
my $dt = DateTime->now->add_duration($dur);
person Ether    schedule 04.06.2010
comment
DateTime::Format::Duration, похоже, не принимает гибкие спецификации времени. Вы можете создать свою собственную спецификацию времени, но тогда она будет анализировать только точно эту спецификацию. Дело в том, что ваш пример не будет работать, если вы не сделаете $formatter->parse_duration('0 years, 0 months, 2 days, 5 hours, 0 minutes, 0 seconds'). - person Ryan C. Thompson; 05.06.2010

У Time::ParseDate довольно гибкий синтаксис для относительного времени. Обратите внимание, что он всегда возвращает абсолютное время, поэтому вы не можете увидеть разницу между «сейчас + 3 часа + 2 дня» и «3 часа + 2 дня» (оба являются допустимыми входными данными для parsedate и вернут одно и то же ценность). Вы можете вычесть time, если хотите вместо этого получить продолжительность.

Кроме того, он не возвращает объекты DateTime, а только время эпохи UNIX. Я не знаю, является ли это проблемой для вашего приложения.

person cjm    schedule 05.06.2010

В итоге я выбрал Time::Duration::Parse .

person Ryan C. Thompson    schedule 06.06.2010