http://www.perlmonks.org?node_id=901335

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

Hi! Whats the smoothest way in perl if I want to reformat date/time strings like this: 2011-04-25T17:07:19-07:00 into MySQL format taking into account the -7 hours eg: 2011-04-25 10:07:19 Thanks!

Replies are listed 'Best First'.
Re: Format date string
by mikeraz (Friar) on Apr 26, 2011 at 12:48 UTC

    Use DateTime module. More than well worth the learning curve.


    Be Appropriate && Follow Your Curiosity
Re: Format date string
by thargas (Deacon) on Apr 26, 2011 at 12:52 UTC

    For anything involving dates/times in perl I always look for a module in the DateTime family, especially if it involves time-zones. Sometimes you end up writing a little more code, but the result is correct and the modules work with each other.

    Probably something like DateTime::Format::Strptime for this.

Re: Format date string
by Anonymous Monk on Apr 26, 2011 at 12:53 UTC
    Specifically see, DateTime::Format::MySQL. No matter what you are doing, if it seems to you to be a fairly common thing to do, you can be certain that there is a CPAN module to do it, at http://search.cpan.org. Look there first and always.
Re: Format date string
by shivnani_s (Initiate) on Apr 26, 2011 at 15:21 UTC

    following code may help. ;)

    ($Second, $Minute, $Hour, $Day, $Month, $Year, $WeekDay, $DayOfYear, $ +IsDST) = localtime(time); $Year += 1900; $Month++; $date = "$Day/$Month/$Year";
Re: Format date string
by anonymized user 468275 (Curate) on Apr 26, 2011 at 13:36 UTC
    First parse it using a regexp, e.g.:
    my ($yr,$mth,$day,$hr,$min,$sec,$sgn,$hr2,$min2) = /^(\d+)\-(\d+)\-(\d+)T(\d+)\:(\d+)\:(\d+)(.)(\d+)\:(\d+)$/;
    Then subtract 1900 from the year and 1 from the month. The values are then compatible with localtime() and other library functions for manipulation and formatting.

    One world, one people

Re: Format date string
by Cristoforo (Curate) on Apr 29, 2011 at 01:48 UTC
    Hello znoopy,
    I think the time zone at the end of the string, -07:00, means this time zone is 7 hours behind (or to the West) of UTC. Then you would need to add the 7 to the hours (giving 2011-04-26 00:07:19)???

    #!/usr/bin/perl use strict; use warnings; use 5.012; use DateTime::Format::Strptime; (my $str = "2011-04-25T17:07:19-07:00") =~ s/:(\d\d)\z/$1/; my( @strp ) = ( DateTime::Format::Strptime->new( pattern => '%FT%T%z', ), DateTime::Format::Strptime->new( pattern => '%F %T', ) ); my $date = $strp[0]->parse_datetime( $str ) or die "Cannot parse $str. + $!"; say $strp[1]->format_datetime( $date->set_time_zone('UTC') ); __END__ C:\Old_Data\perlp>perl t3.pl 2011-04-26 00:07:19