PERL: введите дату и время, создайте начальную и конечную точки из частей ввода и проверьте, если между ними - PullRequest
0 голосов
/ 09 июня 2018

Как новичок, я борюсь с abit.

Я хочу получить данные от пользователя и времени, подобные этому.

2018/06 / 21-10: 30

Затем у меня есть два других раза, которые отмечают начало и конец для ежедневного периода времени.

09: 00 и 14: 00

Я хочу, чтобы скрипт принимал входные данные.Примените часть даты к двум другим временам, чтобы они были такими:

2018/06 / 21-09: 00 и 2018/06 / 21-14: 00

Затем я хочу запустить ввод от пользователя и проверить, совпадает ли введенное время со временем двух других вновь сформированных дат.

Есть ли какой-нибудь отличный способ сделать это?Или другой подход к этому?

:: EDIT 1 ::

Окей.Я играл в abit и нашел способ.
Есть предложения или я иду по правильному пути?

#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
use utf8;
use open qw(:encoding(UTF-8) :std);

use DateTime::Format::Strptime;

print " Enter START with following pattern Y/m/d-H:M -> ";
chomp ( my $input1 = <> );

my $parser = DateTime::Format::Strptime->new(pattern => '%Y/%m/%d-%H:%M');

my $dt1 = $parser->parse_datetime($input1) or die;

my $wd_start_ftd = $dt1->ymd('/')."-09:00";
my $wd_stop_ftd = $dt1->ymd('/')."-14:00";

print "\n Start of the day is ", $wd_start_ftd;
print "\n End of the day is ", $wd_stop_ftd;

Это дает мне

Enter STARTпо следующей схеме Y / m / dH: M -> 2018/06 / 07-10: 30

Начало дня - 2018/06 / 07-09: 00 Конец дня - 2018/06 /07-14: 00

Теперь все, что мне нужно, это получить что-то для проверки, если входное значение находится между значениями пуска и останова.

1 Ответ

0 голосов
/ 09 июня 2018

Ниже приведен полностью рабочий пример.Это может потребовать некоторых настроек для ваших личных предпочтений, таких как то, что вы хотите иметь для входящего сообщения и печати других вещей.Но вы, вероятно, знаете, как это сделать!

Если вы запустите сценарий, он будет ждать ввода в формате YYYY/MM/DD-hh:mm и сообщит вам, если это между 9:00 и 14:00,

use strict;
use warnings;

use DateTime::Format::Strptime;

chomp ( my $input =  <>  );

my $strptime = DateTime::Format::Strptime->new(pattern => '%Y/%m/%d-%H:%M');

my $dt_check = $strptime->parse_datetime($input);
my $dt_start = clone_with_time($dt_check, '09:00');
my $dt_stops = clone_with_time($dt_check, '14:00');


my $check = ( $dt_start lt $dt_check and $dt_check lt $dt_stops ) ? "Yay": "Nay";

print "$check\n";

# return a cloned DateTime object, set with the given time
sub clone_with_time {
    my ($dt_old, $time) = @_;
    my ($hh, $mm) = split /:/, $time;
    my $dt_new = $dt_old->clone;
    $dt_new->set( hour => $hh, minute => $mm);
    return $dt_new
}

Подпрограмма clone_with_time принимает объект DateDime (тот, который мы получили из ввода) и строку времени в формате hh:mm.Затем подпрограмма клонирует этот объект и соответственно устанавливает время.

Подпрограммы удобно иметь, если нужно повторить несколько операторов несколько раз, в этом примере, чтобы сгенерировать $dt_start и $dt_stops.Он поддерживает основную программу в чистоте и прост в использовании.при кодировании помните DRY .

TIMTOWTDI

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...