For more information... RTFM!
NAVIGATION
RECENTLY VIEWED
ACCOUNT LOGIN

You are not logged in

Powered by Interchange version 5.7.0

date_change

The filter converts dates and times, formatted as follows:

MM[/-]DD[/-]YY(YY)?(:hh(mm)?)?

or:

YYYY[/-]MM[/-]DD(:hh(mm)?)?

into the following format:

YYYYMMDD((hh)?(mm)?)?

If the year specification contains only two digits, and is less than 50, then it is treated as an offset from the year 2000, and not from 1900.  In other words, 07 is understood as year 2007, and 80 is understood as year 1980.

If no time is specified in the input then no time will be output.

The filter accepts three optional parameters, as follows:

  • iso - Output date in ISO format.
  • undef - Don't default to current date if no date is specified.
  • no_time - Only output the date.  Ignore the time, if provided.

Example

  1. [filter date_change]2007-01-01[/filter]
  2. [filter date_change]2007/01/01[/filter]
  3. [filter date_change]2007-01-01:10[/filter]
  4. [filter date_change]2007/01/29:1536[/filter]
  5. [filter date_change]01-29-2007:1536[/filter]
  6. [filter date_change]01-29-07:1536[/filter]
  7. [filter date_change]01-29-68:1536[/filter]

Results in:

  1. 20070101
  2. 20070101
  3. 200701010010
  4. 200701291536
  5. 200701291536
  6. 200701291536
  7. 196801291536

Source code

sub {
    my $val = shift;
    shift# discard tag
    my $opt = { map { $_ => 1 } @_ };

    HTML::Entities::decode_entities($val) if $val =~ /&/;
    $val =~ s/\0+//g;
    my $re = $opt->{undef}
        ? qr:^(\d*)[-/]+(\d*)[-/]+(\d*)(.*)$:
            : qr:^(\d+)[-/]+(\d+)[-/]+(\d+)(.*)$:
                            ;
    return $val unless $val =~ /$re/;

    my ($year, $month, $day, $timeval);

    if (length($1) == 4) {
        # ISO date style 2003-03-20
        ($year, $month, $day) = ($1, $2, $3);
    }
    else {
        # U.S. date style 3/20/2003 or 3/20/03
        ($year, $month, $day) = ($3, $1, $2);
    }

    $timeval = $4;

    if ($opt->{undef}) {
        # return nothing (undef, which DBI treats as SQL NULL) for an
        # empty date (all zeroes or nothing at all)
        return unless grep /[1-9]/, ($year, $month, $day);
    }

    # Y2K fun: Try to guess intent of year "03" as "2003"
    if (length($year) < 4) {
        $year = $year < 50 ? $year + 2000 : $year + 1900;
    }

    my ($date_format, $time_format);
    if ($opt->{iso}) {
        $date_format = '%04d-%02d-%02d';
        $time_format = 'T%02d:%02d:%02d';
    }
    else {
        $date_format = '%04d%02d%02d';
        $time_format = '%02d%02d';
    }

    my $time;
    if ($timeval =~ /^:(\d{1,4})\s*$/) {
        # accept traditional Interchange date_time widget times
        # of format '0130', e.g. '20080201:0130'
        $time = sprintf('%04d', $1);
        $time = sprintf($time_format, substr($time, 0, 2), substr($time, 2, 2));
    }
    elsif (
        my ($hours, $minutes, $seconds) = ($timeval =~ /\s(\d\d?):(\d\d?)(?::(\d\d+))/)
    ) {
        # accept times of format '1:30', '1:30:05',
        # to support PostgreSQL's timestamp with time zone format
        # e.g. '2008-02-01 01:30:05-07'
        $time = sprintf($time_format, $hours, $minutes, $seconds);
    }

    my $out = sprintf($date_format, $year, $month, $day);
    $out .= $time if $time and not $opt->{no_time};
    return $out;
}

Category:  Filters
Last modified by: Kevin Walsh
Modification date: Monday 26 February 2007 at 11:39 AM (EST)
Home  |  Legal nonsense  |  Privacy policy  |  Contact us