At 5:07 PM +1000 2/10/03, Scott Penrose wrote:
-----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);



Reply via email to