Как исправить критическую ошибку Perl Business :: Hours Bad order 2?

#perl #rt

#perl #rt

Вопрос:

У нас есть отслеживание запросов 4.4.3. Там у нас есть автоматизированный скрипт, который использует распределение Business:: Hours. Вот важная часть:

 sub IsApplicable {
    my $self = shift;
    my $bhours = $self->BusinessHours;
    my $ticket = $self->TicketObj;
    my $due = $ticket->DueObj->Unix;
    my $bseconds = $bhours->between( time(), $due );
}
  

Иногда мы получаем ошибку в stderr:

 [23406] [Wed Mar 13 07:40:09 2019] [critical]: Set::IntSpan::_copy_run_list: Bad order 2: 1552462809-1552462694
 at /usr/local/share/perl5/Business/Hours.pm line 269. (/opt/rt4/bin/../lib/RT.pm:408)
Set::IntSpan::_copy_run_list: Bad order 2: 1552462809-1552462694
 at /usr/local/share/perl5/Business/Hours.pm line 269.
  

Кажется, это не имеет смысла, 1552462809-1552462694 в значительной степени оценивается в 115.

Как проанализировать / исправить эту ошибку?

Ответ №1:

Согласно документации Business:: Hours:

между НАЧАЛОМ, окончанием

Возвращает количество рабочих секунд между НАЧАЛОМ и ОКОНЧАНИЕМ, как НАЧАЛО, так и ОКОНЧАНИЕ должны быть указаны в секундах с момента начала эпохи.

Возвращает -1, если НАЧАЛО или окончание выходят за пределы расчетных рабочих часов.

Так что, вероятно, END должно быть больше, чем START

Комментарии:

1. -1 — это не ошибка, это -1. Но, возможно, вы правы относительно того, что END должно быть больше, чем START, но откуда нам знать наверняка?

2. Это числа, поэтому используйте операторы числового сравнения. my $now = time(); return ... if $now >= $due; my $bseconds = $bhours->between( $now, $due ); ...

3. Приведенный текст на самом деле не объясняет, почему он не работает. В вашем последнем предложении есть. Точнее, Business::Hours использует Set::IntSpan для вычисления продолжительности периода, а Set::IntSpan хочет, чтобы начало было больше конца (см. в источнике Set::IntSpan, который в какой-то момент был вызван Business::Hours).

4. Хорошо, спасибо всем, заменил $ due и time(), потому что помимо ошибки скрипт не работал так, как нужно.