Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Date::Manip and date

by Anonymous Monk
on Jul 09, 2015 at 08:41 UTC ( #1133913=perlquestion: print w/replies, xml ) Need Help??

Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi, I've the following within an Perl script which reads an csv file for the input the date within the csv file is yyyy-mm-dd
$begindate = @fields[13]; my @begindate_fields = split"-", $begindate; $enddate = @fields[14]; my @enddate_fields = split"-", $enddate; $normalized_begindate = @begindate_fields[2]."/".@begindate_fields +[1]."/".@begindate_fields[0]; $normalized_enddate = @enddate_fields[2]."/".@enddate_fields[1]."/ +".@enddate_fields[0]; $begindate_seconds = UnixDate( ParseDate($normalized_begindate." 0 +0:00:00"), "%s" ); $enddate_seconds = UnixDate( ParseDate($normalized_enddate. +" 00:00:00"), "%s" );
The dates form the csv file have to be convert to epoch. It read the begin date and convert it, but it does not convert the end date. Also if the begin date within the csv file is for example 1988-12-13 it does not convert it. If the begin date is for example 1988-10-10 then it converts. So two issue to solve :)

Replies are listed 'Best First'.
Re: Date::Manip and date
by Athanasius (Bishop) on Jul 09, 2015 at 10:20 UTC

    First, a single array element should be written like this:

    $begindate_fields[2];

    and not like this:

    @begindate_fields[2];

    The latter is an array slice. The warnings pragma would have told you this. You should always start your script with:

    use strict; use warnings;

    This will save you a lot of time and trouble in the long run.

    Second, Date::Manip::ParseDate interprets your dates as MM/DD/YYYY, not DD/MM/YYYY. So 1988-12-13 becomes the twelfth day of the thirteenth month of 1988 — which does not exist. You need to swap the first and second array indices:

    my $normalized_begindate = $begindate_fields[1] . "/" . # Month $begindate_fields[2] . "/" . # Day $begindate_fields[0]; # Year my $normalized_enddate = $enddate_fields [1] . "/" . # Month $enddate_fields [2] . "/" . # Day $enddate_fields [0]; # Year

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

      By default ParseDate uses MM/DD/YYYY, but you can change that. If you add the following:
      Date_Init("DateFormat=non-US");
      it will interpret this as DD/MM/YYYY.
      Of course, Date::Manip will also interpret YYYY-MM-DD directly, so there's really no need to transform the dates into DD/MM/YYYY format.

      Thank you Athanasius it works like an charm

Re: Date::Manip and date
by neilwatson (Priest) on Jul 09, 2015 at 12:46 UTC

    Also Time::Piece

    use Time::Piece; my $date1 = Time::Piece->localtime(); my $date2 = Time::Piece->strptime( $args{date}, "%Y-%m-%dT%H:%M:%S" ); if ( $date2 > $date2 ) { # do something }; my $diff = $date1 - $date2; # in seconds my $days = $diff->days

    Neil Watson
    watson-wilson.ca

Re: Date::Manip and date
by pme (Prior) on Jul 09, 2015 at 10:25 UTC
    These Date::Manip subroutines would make the conversion simpler.
    $secs = Date_SecsSince1970($m,$d,$y,$h,$mn,$s); $secs = Date_SecsSince1970GMT($m,$d,$y,$h,$mn,$s);
Re: Date::Manip and date
by Anonymous Monk on Jul 09, 2015 at 11:31 UTC

    I prefer DateTime with DateTime::Format::Strptime:

    use DateTime; use DateTime::Format::Strptime; my $p = DateTime::Format::Strptime->new(on_error=>'croak', pattern => '%Y-%m-%d'); my $dt = $p->parse_datetime('1988-12-13'); print $dt, " -> ", $dt->epoch, "\n"; __END__ 1988-12-13T00:00:00 -> 597974400

    (Maybe slightly overkill in this situation but when parsing date/time formats with times and especially handling time zones it becomes really useful.)

      Or you can continue to use Date::Manip. The exact equivalent of the DateTime script is:
      use Date::Manip::Date; my $date = new Date::Manip::Date; $date->parse('1988-12-13'); print $date->printf('%O -> %s');
      and Date::Manip handles all time zones just like the DateTime modules.
        Minor correction. It's not exact, in case of DateTime it's 1988-12-13T00:00:00 UTC, and in case of Date::Manip it's local time. It should be:
        $date->parse('1988-12-13 UTC');
        I wonder if it is possible to pass time zone separately from the date.
Re: Date::Manip and date
by 1nickt (Abbot) on Jul 09, 2015 at 09:38 UTC

    As it says right above the box you typed in:

    Use: <p> text here (a paragraph) </p> and: <code> code here </code> to format your post; it's "PerlMonks-approved HTML":
    Remember: Ne dederis in spiritu molere illegitimi!
Re: Date::Manip and date
by Anonymous Monk on Jul 09, 2015 at 09:43 UTC

    Hi, I've the following within an Perl script which reads an csv file for the input the date within the csv file is yyyy-mm-dd

    $begindate = @fields13; my @begindate_fields = split"-", $begindate; + $enddate = @fields14; my @enddate_fields = split"-", $enddate; $norm +alized_begindate = @begindate_fields2."/".@begindate_fields1."/".@beg +indate_fields[0]; $normalized_enddate = @enddate_fields2."/".@enddate +_fields1."/".@enddate_fields[0]; $begindate_seconds = UnixDate( Parse +Date($normalized_begindate." 00:00:00"), "%s" ); $enddate_seconds = U +nixDate( ParseDate($normalized_enddate." 00:00:00"), "%s" );

    The dates form the csv file have to be convert to epoch. It read the begin date and convert it, but it does not convert the end date. Also if the begin date within the csv file is for example 1988-12-13 it does not convert it. If the begin date is for example 1988-10-10 then it converts. So two issue to solve :)

    2019-01-19 Athanasius fixed code wrapping

      Thanks for trying to clean up your post. All the code is on one line! I've inserted some new-lines :)

      It's not clear what you are trying to do: please post your input data, what you would like to get as output data, and what your code outputs now. And show where your original date comes from ...

      $begindate = @fields13; my @begindate_fields = split"-", $begindate; $enddate = @fields14; my @enddate_fields = split"-", $enddate; $normalized_begindate = @begindate_fields2."/".@begindate_fields1."/". +@begindate_fields[0]; $normalized_enddate = @enddate_fields2."/".@enddate_fields1."/".@endda +te_fields[0]; $begindate_seconds = UnixDate( ParseDate($normalized_begindate." 00:00 +:00"), "%s" ); $enddate_seconds = UnixDate( ParseDate($normalized_enddate." 00:00:00" +), "%s" );
      Remember: Ne dederis in spiritu molere illegitimi!

        Input data, the csav file

        ABC;1234;6789;Appel and;1234;111;23456;1988-10-20;2015-12-31;1;Compan;000;1;1988-12-13;2015-12-30;123456 ABC;1234;6789;Orange and .;1234;11;23456;1969-01-01;2015-12-31;1;Com;000;1;1988-10-10;2015-12-30;654321

        Output data now

        123456#000###5244319620#Compan 654321#000#592437600##5244319620#Orange and

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (4)
As of 2020-07-08 05:06 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?