Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked
 
PerlMonks  

How do I convert date format between 'DD-MM-YYYY' and 'YYYY-MM-DD' back & forth?

( #614222=categorized question: print w/ replies, xml ) Need Help??
Contributed by naikonta on May 08, 2007 at 19:26 UTC
Q&A  > dates and times


Description:

I provide a field for user to type in a date string, mostly in 'DD-MM-YYYY' format, and store it later in MySQL database, which uses 'YYYY-MM-DD' format. But sometimes, users use different separators such as slashes and dots. And in the edit form I have to display the date back to its original form. How do I do that? (Assume the input is in valid date range.)

Answer: How do I convert date format between 'DD-MM-YYYY' and 'YYYY-MM-DD' back & forth?
contributed by jettero

use Date::Manip:

my $date = UnixDate( ParseDate($thingy), '%Y-%m-%d' );
Answer: How do I convert date format between 'DD-MM-YYYY' and 'YYYY-MM-DD' back & forth?
contributed by naikonta

Well, basically, just reverse the date components in the list and put it back as string.

my $in_date = '30-04-2007'; my $db_date = join '-', reverse split '-', $in_date; # to get the original format, do the same thing my $pr_date = join '-', reverse split '-', $db_date; print "in: $in_date; db: $db_date; pr: $pr_date\n"; # in: 30-04-2007; db: 2007-04-30; pr: 30-04-2007
For multi-possible-separator, use the non-digit character class for split().
my $in_date = '02/05/2007'; # or 02.05.2007, or any non-digit-separato +rs my $db_date = join '-', reverse split /\D/, $in_date; # to get the original format, do the same thing as before my $sep = '-'; my $pr_date = join $sep, reverse split '-', $db_date; print "in: $in_date; db: $db_date; pr: $pr_date\n"; # in: 02/05/2007; db: 2007-05-02; pr: 02-05-2007
In this situation, there's no way to convert the date back with its original separator unless you kept it somewhere somehow, if that really matters. Besides, this might be a good chance to enforce your standard separator :-)
Answer: How do I convert date format between 'DD-MM-YYYY' and 'YYYY-MM-DD' back & forth?
contributed by naikonta

The following answer uses regexes.

# UK-style my $in_date = '30-04-2007'; (my $db_date = $in_date) =~ s/(\d\d)-(\d\d)-(\d\d\d\d)/$3-$2-$1/; (my $pr_date = $db_date) =~ s/(\d\d\d\d)-(\d\d)-(\d\d)/$3-$2-$1/; print "in: $in_date; db: $db_date; pr: $pr_date\n"; # in: 30-04-2007; db: 2007-04-30; pr: 30-04-2007
# US-style my $in_date = '05-14-2007'; (my $db_date = $in_date) =~ s/(\d\d)-(\d\d)-(\d\d\d\d)/$3-$1-$2/; (my $pr_date = $db_date) =~ s/(\d\d\d\d)-(\d\d)-(\d\d)/$2-$3-$1/; print "in: $in_date; db: $db_date; pr: $pr_date\n"; # in: 05-14-2007; db: 2007-05-14; pr: 05-14-2007
Instead of rolling your own, some CPAN modules might help, such as Date::Tiny, Date::Formatter, or Date::Simple. They look promising but I haven't tried them myself.
Answer: How do I convert date format between 'DD-MM-YYYY' and 'YYYY-MM-DD' back & forth?
contributed by naikonta

Just in case you specify that the date must be in US-style (MM-DD-YYYY), then the above split won't work.

my $in_date = '11-24-2007'; # or 11/24/2007, or 11.24.2007, or any non +-digit-separators my @parts = split /\D/, $in_date; my $db_date = join '-', @parts[2, 0, 1]; # to get the original format: my $sep = '-'; my @parts = split $sep, $db_date; my $pr_date = join $sep, @parts[1, 2, 0]; print "in: $in_date; db: $db_date; pr: $pr_date\n"; # in: 11-24-2007; db: 2007-11-24; pr: 11-24-2007

Please (register and) log in if you wish to add an answer



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • Outside of code tags, you may need to use entities for some characters:
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.
  • Log In?
    Username:
    Password:

    What's my password?
    Create A New User
    Chatterbox?
    and the web crawler heard nothing...

    How do I use this? | Other CB clients
    Other Users?
    Others wandering the Monastery: (12)
    As of 2014-10-23 21:14 GMT
    Sections?
    Information?
    Find Nodes?
    Leftovers?
      Voting Booth?

      For retirement, I am banking on:










      Results (129 votes), past polls