Я пишу сценарий жемчуга, который выбирает вариант "продолжительности", и я хотел бы смочь указать эту продолжительность довольно гибким способом, только в противоположность взятию единого блока (например, число секунд). UNIX at
управляйте реализует этот вид поведения, путем разрешения спецификаций такой как "теперь + 3 часа + 2 дня". Для моей программы "теперь" подразумевается часть, таким образом, я просто хочу проанализировать материал после знака "плюс". (Отметьте: at
управляйте также анализирует спецификации точной даты, но я только хочу проанализировать продолжительности.)
Существует ли модуль жемчуга для парсинга спецификаций продолжительности как это? Мне не нужен точный синтаксис, принятый at
, просто любой разумный синтаксис для определения продолжительностей времени.
Править: В основном я хочу что-то как DateTime:: Формат:: Гибкий на время вместо дат.
Взгляните на 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);
Time::ParseDate имеет довольно гибкий синтаксис для относительного времени. Обратите внимание, что он всегда возвращает абсолютное время, поэтому вы не сможете отличить "сейчас + 3 часа + 2 дня" от "3 часа + 2 дня" (оба эти значения являются допустимыми входными данными для parsedate
и вернут одно и то же значение). Вы можете вычесть time
, если хотите получить длительность.
Кроме того, он не возвращает объекты DateTime, только время эпохи UNIX. Я не знаю, является ли это проблемой для вашего приложения.