Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re: timestamp manipulation and evaluation

by Anonymous Monk
on Aug 17, 2012 at 19:44 UTC ( #988083=note: print w/ replies, xml ) Need Help??


in reply to timestamp manipulation and evaluation

cpanp -i DateTime::Duration DateTime::Format::Human::Duration DateTime::Format::Natural

#!/usr/bin/perl -- use strict; use warnings; use DateTime::Duration; use DateTime::Format::Human::Duration; use DateTime::Format::Natural; @ARGV = ( "last week", "today" ) unless @ARGV; my $dfn = DateTime::Format::Natural->new; my $start = $dfn->parse_datetime(shift); my $end = $dfn->parse_datetime(shift); my $diff = $end - $start; print "$end - $start = ", DateTime::Format::Human::Duration->new->format_duration($diff), "\n" +; __END__ 2012-08-04T00:00:00 - 2012-07-28T00:00:00 = 1 week


Comment on Re: timestamp manipulation and evaluation
Download Code
Re^2: timestamp manipulation and evaluation
by Cristoforo (Deacon) on Aug 17, 2012 at 21:01 UTC
    Very nice example of these DateTime modules. I installed them and hope they are useful. But, it doesn't exactly figure the intersecting time of 2 sets of start, end times.

    But here is a way to do it that produces output like he wanted. There are other modules besides DateTime that would provide solutions, Time::Piece (Time::Piece was first released with perl v5.9.5), Date::Parse, Time::Local, and probably others.

    Either set of beg/end times could be switched, ($d1_beg and $d1_end could have been named $d2_beg, $d2_end and vice versa and this method would still be correct.

    Chris

    #!/usr/bin/perl use strict; use warnings; use DateTime::Format::Strptime; use List::Util qw/ maxstr minstr /; # first released with perl v5.7.3 my $d1_beg = '2012-08-17 12:00:00'; my $d1_end = '2012-08-17 13:00:00'; my $d2_beg = '2012-08-17 09:00:00'; my $d2_end = '2012-08-17 12:30:00'; if ($d2_beg ge $d1_end or $d2_end le $d1_beg) { print "No common time\n"; } else { my $start = maxstr($d1_beg, $d2_beg); my $end = minstr($d1_end, $d2_end); my $dt = DateTime::Format::Strptime->new(pattern => "%F %T"); my @dt = map $dt->parse_datetime($_), $start, $end; my $dur = $dt[1]->delta_ms($dt[0])->in_units('minutes'); # duratio +n print "$start for $dur minutes\n"; } __END__ *** prints 2012-08-17 12:00:00 for 30 minutes

    Update: There is a nice discussion here about handling durations with DateTime.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://988083]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (16)
As of 2015-07-02 19:36 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (45 votes), past polls