use strict;
use warnings;
use DateTime qw( );
use DateTime::Format::Strptime qw( );
# Returns true if range ($dt_s, $dt_e)
# spans any part of any of the @hours.
sub hour_in_range {
my ($dt_s, $dt_e, @hours) = @_;
# Find the floor.
( $dt_s = $dt_s->clone() )
->truncate( to => 'hour' );
for my $hour (@hours) {
( my $dt = $dt_s->clone() )
->set_hour($hour);
$dt->add( days => 1 ) if $dt < $dt_s;
return 1 if $dt <= $dt_e;
}
return 0;
}
{
my @hours = (1, 11); # Hours to check
my $parser = new DateTime::Format::Strptime(
pattern => '%Y-%m-%d %H:%M:%S',
time_zone => 'local',
);
<DATA>; # Skip first line
while (<DATA>) {
chomp;
my ($ts_s, $ts_e, $text) = split /\|/;
my $dt_s = $parser->parse_datetime( $ts_s );
my $dt_e = $parser->parse_datetime( $ts_e );
if (hour_in_range($dt_s, $dt_e, @hours)) {
print "Match\n";
} else {
print "Not Match\n";
}
}
}
__DATA__
Start_Time |End Time |TEXT
2009-07-22 08:00:00|2009-07-22 08:00:00|blablalblabla
2009-07-22 01:00:00|2009-07-22 01:00:00|blablalblabla
2009-07-22 08:00:00|2009-07-22 21:00:00|blablalblabla
2009-07-22 23:00:00|2009-07-23 00:00:00|blablalblabla
2009-07-22 23:00:00|2009-07-23 02:00:00|blablalblabla