Re: Date::Manip and date
by Athanasius (Archbishop) 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,
| [reply] [d/l] [select] |
|
|
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. | [reply] [d/l] |
|
|
| [reply] |
Re: Date::Manip and date
by neilwatson (Priest) on Jul 09, 2015 at 12:46 UTC
|
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
| [reply] [d/l] |
Re: Date::Manip and date
by pme (Monsignor) 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);
| [reply] [d/l] |
Re: Date::Manip and date
by Anonymous Monk on Jul 09, 2015 at 11:31 UTC
|
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.) | [reply] [d/l] |
|
|
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.
| [reply] [d/l] |
|
|
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. | [reply] [d/l] |
|
|
Re: Date::Manip and date
by 1nickt (Canon) on Jul 09, 2015 at 09:38 UTC
|
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!
| [reply] [d/l] |
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
| [reply] [d/l] |
|
|
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!
| [reply] [d/l] |
|
|
| [reply] |