-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
I am trying to do the age old problem...
* Here is DateTime 1 * Here is DateTime 2 * Here is the working week (Mon-Fri, 9-5) (or whatever we define) * Tell me the working hours between DateTime 1 and DateTime 2
eg:
DateTime 1 DateTime 2 Difference
19/8/2003 16:35 20/8/2003 11:15 2:40
or - 2 hours, 40 minutes
What is the simplest, shortest way.
G'day Scott,
I promised a few months back to talk about DateTime sometime soon. Tell me when and I'll be there. The following *should* solve your problem, but doesn't. I get a strange error at the end when creating the intersection. To solve this (and maybe to get a better answer) I've CC'd this to the DateTime mailing list.
G'day DateTimers, Any clues on why the intersections don't create properly?
use DateTime; use DateTime::Span; use DateTime::Set; use DateTime::SpanSet;
use Data::Dumper; # For displaying results
$datetime1 = DateTime->new(
year => 2003,
month => 8,
day => 19,
hour => 16,
minute => 35
);
$datetime2 = DateTime->new(
year => 2003,
month => 8,
day => 20,
hour => 11,
minute => 15
);$span = DateTime::Span->from_datetimes(
start => $datetime1,
end => $datetime2
);
$wd_start = DateTime::Set->from_recurrence( recurrence => sub { # Tomorrow at 9 am $_[0]->truncate( to => 'day' )->add( days => 1, hours => 9 ); # Add two days if it's Saturday $_[0]->add( days => 2) if $_[0]->day == 6; }, );
$wd_end = DateTime::Set->from_recurrence(
recurrence => sub {
# Tomorrow at 5pm
$_[0]->truncate( to => 'day' )->add( days => 1, hours => 17 );
# Add two days if it's Saturday
$_[0]->add( days => 2) if $_[0]->day == 6;
},
);$working_hours = DateTime::SpanSet->from_sets(
start_set => $wd_start,
end_set => $wd_end,
);$relevent_work_hours = $working_hours->intersection( $span );
print Dumper($relevent_work_hours->duration->deltas);
