I've just started using Template::Plugin::Date. I was surprised to discover that it only accepts dates in the format 'H:M:S D/M/Y'. (I shouldn't have to format my dates in order to pass them to the date formatter! :)

The first attached patch allows Template::Plugin::Date to also accept dates in the format 'Y-M-D H:M:S', which is the default format for many databases. The code checks the length of the first and last parts to determine which format the date is in. I also added a couple tests.

The other attached patch updates the documentation for Template::Plugin::Date in docsrc.

Feedback welcome.


(In the meantime, I've written a subclass of Template::Plugin::Date that wraps the format() function and converts the date to the accepted format.)

Ronald
Only in Template-Toolkit-2.19: .defaults.cfg
diff -r -u Template-Toolkit-2.19.orig/lib/Template/Plugin/Date.pm 
Template-Toolkit-2.19/lib/Template/Plugin/Date.pm
--- Template-Toolkit-2.19.orig/lib/Template/Plugin/Date.pm      2007-04-27 
13:56:05.000000000 -0400
+++ Template-Toolkit-2.19/lib/Template/Plugin/Date.pm   2007-07-06 
12:45:08.000000000 -0400
@@ -98,11 +98,27 @@
     }
     else {
         # if $time is numeric, then we assume it's seconds since the epoch
-        # otherwise, we try to parse it as a 'H:M:S D:M:Y' string
-        @date = (split(/(?:\/| |:|-)/, $time))[2,1,0,3..5];
-        return (undef, Template::Exception->new('date',
-               "bad time/date string:  expects 'h:m:s d:m:y'  got: '$time'"))
-            unless @date >= 6 && defined $date[5];
+        # otherwise, we try to parse it as either a 'Y:M:D H:M:S' or a
+        # 'H:M:S D:M:Y' string
+
+        my @parts = (split(/(?:\/| |:|-)/, $time));
+
+        if (@parts >= 6) {
+            if (length($parts[0]) == 4) {
+                # year is first; assume 'Y:M:D H:M:S'
+                @date = @parts[reverse 0..5];
+            }
+            elsif (length($parts[5]) == 4) {
+                # year is last; assume 'H:M:S D:M:Y'
+                @date = @parts[2,1,0,3..5];
+            }
+        }
+
+        if ([EMAIL PROTECTED]) {
+            return (undef, Template::Exception->new('date',
+                   "bad time/date string:  " .
+                   "expects 'h:m:s d:m:y'  got: '$time'"));
+        }
         $date[4] -= 1;     # correct month number 1-12 to range 0-11
         $date[5] -= 1900;  # convert absolute year to years since 1900
         $time = &POSIX::mktime(@date);
diff -r -u Template-Toolkit-2.19.orig/t/date.t Template-Toolkit-2.19/t/date.t
--- Template-Toolkit-2.19.orig/t/date.t 2007-03-13 15:23:31.000000000 -0400
+++ Template-Toolkit-2.19/t/date.t      2007-07-06 12:36:57.000000000 -0400
@@ -197,7 +197,14 @@
 
 -- test --
 [% USE date %]
-[% date.format('4:20:00 6-13-2000', '%H') %]
+[% date.format('4:20:00 13-6-2000', '%H') %]
+
+-- expect --
+04
+
+-- test --
+[% USE date %]
+[% date.format('2000-6-13 4:20:00', '%H') %]
 
 -- expect --
 04
@@ -249,5 +256,11 @@
 -%]
 -- expect --
 12:59
+-- test --
+[% USE date;
+   date.format('2001/09/30 12:59:00', '%H:%M')
+-%]
+-- expect --
+12:59
 
 
diff -u -r docsrc.orig/src/Modules/Template/Plugin/Date.tt2 
docsrc/src/Modules/Template/Plugin/Date.tt2
--- docsrc.orig/src/Modules/Template/Plugin/Date.tt2    2002-08-20 
19:29:17.000000000 -0400
+++ docsrc/src/Modules/Template/Plugin/Date.tt2 2007-07-06 12:49:14.000000000 
-0400
@@ -6,9 +6,11 @@
     # use current time and default format
     [% date.format %]
 
-    # specify time as seconds since epoch or 'h:m:s d-m-y' string
+    # specify time as seconds since epoch
+    # or as a 'h:m:s d-m-y' or 'y-m-d h:m:s' string
     [% date.format(960973980) %]
     [% date.format('4:20:36 21/12/2000') %]
+    [% date.format('2000/12/21 4:20:36') %]
 
     # specify format
     [% date.format(mytime, '%H:%M:%S') %]
@@ -64,8 +66,9 @@
 
     File last modified: [% date.format(filemod_time) %]
 
-The time/date can also be specified as a string of the form 'h:m:s d/m/y'.
-Any of the characters : / - or space may be used to delimit fields.
+The time/date can also be specified as a string of the form 'h:m:s d/m/y'
+or 'y/m/d h:m:s'.  Any of the characters : / - or space may be used to
+delimit fields.
 
     [% USE day = date(format => '%A', locale => 'en_GB') %]
     [% day.format('4:20:00 9-13-2000') %]  

Reply via email to