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

Is there an easy way to drop the leading zeros from dates? For example, If someone enters a date as 07/04/2001, is there a way to simply convert that to 7/4/2001? I am really new at this, but my mind keeps going back to having to parse the string and see if the piece (Month or Day) is less than 10 then some how read the two digits individually and resmove the first. I'm sure there's a better way. Thanks!! Glenn.
  • Comment on How do I drop leading zeros from a date like 07/04/2001 to read 7/4/2001??

Replies are listed 'Best First'.
(Ovid) Re: How do I drop leading zeros from a date like 07/04/2001 to read 7/4/2001??
by Ovid (Cardinal) on Nov 27, 2001 at 03:12 UTC

    Just off the top of my head:

    my $date = '07/04/2001'; $date = join '/', map { $_+0 } split /\//, $date; print $date;

    That statement should be read right to left. It splits the $date on the forward slash and passes each segment to the map. map adds zero to each, which forces the string to be numeric, which is what drops that leading zero. The final join restores it to the original format.

    You also might find the following a little easier to understand:

    $date =~ s!^0+!!; # trim leading zeroes $date =~ s!/0+!/!g; # trim zeroes after a /

    Update: Just saw Kanji's better answer on another node (the parent was cross-posted by original author):

    $date =~ s/\b0//g;

    Cheers,
    Ovid

    Join the Perlmonks Setiathome Group or just click on the the link and check out our stats.

      Since the cross-post and my response seem to have dissappeared, I think it's worth restating that s/\b0//g will also truncate the year if you use the short form (01) instead of the long (2001).

      A more flexible approach (that leaves the year intact even if it does start with an 0) might be something like ...

      sub unpad_datestring { ## Strip the leading 0s from the day and month portions of ## a YMD-style datestring. ## The only mandatory argument is the date string itself, ## which assumes the string is delimeted by a slash and ## ordered American-style ( MDY ). If that assumption is ## wrong, you can override either or both via the 'delim' ## and 'order' arguments ... ## '07/04/2001' ## '04/07/01', 'order' => [qw( d m y )] ## '01.07.04', 'order' => [qw( y m d )], 'delim' => '.' my $date = shift or return; my %args = ( 'order' => [qw(d m y)], 'delim' => '/', @_, ); my @date = split /\Q$args{'delim'}/, $date; for ( my $x = 0; $x < @date; $x++ ) { $date[$x] = int $date[$x] if lc $args{'order'}->[$x] =~ /^[dm]$/; } return join $args{'delim'}, @date; }

          --k.


Re (tilly) 1: How do I drop leading zeros from a date like 07/04/2001 to read 7/4/2001??
by tilly (Archbishop) on Nov 27, 2001 at 03:37 UTC
    Is that date April 7, 2001 or July 4, 2001?

    If your code will ever be dealt with by an international audience, I strongly recommend either making date formats customizable, or else switching to something that everyone can understand, like 2001-07-04.

(clive ;-) Re: How do I drop leading zeros from a date like 07/04/2001 to read 7/4/2001??
by cLive ;-) (Prior) on Nov 27, 2001 at 03:49 UTC
    timtowtdi:
    $date = '07/04/2001'; # (e)valuate right side as an expression # do a (g)lobal replace - ie all matches $date =~ s/(\d+)/$1+0/ge; print "$date\n";

    cLive ;-)

Re: How do I drop leading zeros from a date like 07/04/2001 to read 7/4/2001??
by Maclir (Curate) on Nov 27, 2001 at 08:57 UTC
    Some comments on dates.
    1. Store dates internally as "seconds since start of epoch". That way you can easily convert from one format to another.
    2. When showing dates (on a screen, or a printed report) DO NOT invite confusion between US and non-Us people by the ambiguous m/d/yyyy (or was that d/m/yyyy) format. Use the three character abbreviation for the month. So the date would be shown as Jul 4 2001 (or 7 Apr 2001).
    3. Read chapter 3 of the "Perl Cookbook".
Re: How do I drop leading zeros from a date like 07/04/2001 to read 7/4/2001??
by slayven (Pilgrim) on Nov 27, 2001 at 03:25 UTC
    $date =~ s/0(\d\/)/$1/g;

    --
    trust in bash
    but tie your camel
Re: How do I drop leading zeros from a date like 07/04/2001 to read 7/4/2001??
by c (Hermit) on Nov 27, 2001 at 03:38 UTC
    Update:okay, i think that you can use the following code to get the desired results:

    #!/usr/bin/perl -w use strict; use POSIX qw(strftime); my $date = strftime("%-m/%e/%Y", localtime);

    the hyphen should flag that you do not want padding for the result of the month value of %m which by default will be padding in month represented by a single digit 1-9.

    Update:It looks as though %m still pads the month with a zero. I'll start reading through POSIX::Strftime and see what I can find...

    If you're using strftime, try using:

    my $date = strftime("%m/%e/%Y",localtime);

    humbly -c

Re: How do I drop leading zeros from a date like 07/04/2001 to read 7/4/2001??
by Dogma (Pilgrim) on Nov 27, 2001 at 05:45 UTC
    You could simply treat each field in your code as an integer. Granted typing isn't the easiest thing in perl but then the padded zero wouldn't really matter.
        I like it. As long as we're going for shorter *and* clearer, you can simplify the first param to split making it one character shorter and slightly more readable.... especially since it now matches the first param of your join.
        $date = join '/', map int, split '/', $date;

        -Blake