Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Проверка интервала времени


Автор: destby 19.4.2011, 10:40
Существует конфиг файл, в котором есть что-то вроде:
Код

timeInterval=00-23

то есть, скрипту разрешается выполнять некие действия в промежутке времени от 00:00 до 23:00
Сделал проверку вроде такой:
Код

my $timeInterval = # забираем из конфиг файла значение "00-23"
my $hour = localtime(time)[2];
my ( $start, $end ) = split '-', $timeInterval;
if ( $hour > $start and $hour < $end ) {
      # делаем что-то
}

Такое работает в случае, если интервал с 00 до 23, но если, к примеру, интервал будет с 22 до 00, то эта проверка не прокатит.
Подскажите, может быть можно как-то регекспами это побороть или каким другим способом?
Заранее благодарю.

Автор: arto 19.4.2011, 10:58
$end eq "00" ? 1 : $hour < $end ?

perldoc Time::Interval

Автор: destby 19.4.2011, 12:48
Цитата(arto @ 19.4.2011,  10:58)
$end eq "00" ? 1 : $hour < $end ?

perldoc Time::Interval

Не совсем понятно как пользоваться этим Time::Interval, какой из его методов юзать?

Автор: shamber 19.4.2011, 13:49
Не туда влез smile

Автор: arto 19.4.2011, 14:01
вычислите начало и конец интервала в секундах, и проверяйте попадание time() туда.

Автор: alezzz 19.4.2011, 14:19
удалил... smile
arto уже это написал, только в другом сиде.

Автор: Pfailed 20.4.2011, 12:05
В одном из проектов была похожая ситуация. Сначала был написан наивный варинат наподобии варианта топикстартера. Через пару дней баг всплыл наружу. Пришлось вооружиться ручкой и листочком и расписать все варианты. Больше, насколько знаю, жалоб не было.
Код

sub can_do($$) {
    my ($start, $end) = @_;
    
    my $now = (localtime)[2];
    my $denied = 0;
    
    if ($end == $start) {
        # no time limits
    }
    elsif ($end < $start) {
        # start in the one day, end in the next day
        if ($now < $start && $now > $end) {
            # current time not in the interval [start, 23:59] or [00:00, end]
            $denied = 1;
        }
    }
    elsif ($now < $start || $now > $end) {
        # start and end in the same day
        # current time not in the interval [start, end]
        $denied = 1;
    }
    
    return !$denied;
}


can_do(21, 6)
    or die "I can't";

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)