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
In reply to Re: Check if Date interval contains Hour X
by ikegami
in thread Check if Date interval contains Hour X
by gulden
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |