Модуль Perl для анализа спецификаций длительности времени на естественном языке (аналог команды at)? - PullRequest
1 голос
/ 05 июня 2010

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

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


Редактировать: В основном я хочу что-то вроде DateTime :: Format :: Flexible для продолжительности вместо даты.

Ответы [ 3 ]

2 голосов
/ 05 июня 2010

Посмотрите на 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);
0 голосов
/ 06 июня 2010

Я закончил с Time :: Duration :: Parse .

0 голосов
/ 05 июня 2010

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

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

...