Subject: Re: bug#21229: 24.5; parse-time-string ignore PM/AM

From: Tino Calancha <[email-masked]>
Date: Tue, 11 Aug 2015 19:37:00 +0900 (JST)

I attached a patch showing how i am dealing temporally with this
AM/PM issue.

We have rule for iso 8601:
"%Y-%m-%d"

It should be possible to add support for:
"%m/%d/%y"

(similarly as we have several rules for HH:MM:SS)

I guess its natural to support both.

Tino

On Tue, 11 Aug 2015, Nicolas Richard wrote:

> Tino Calancha <[email-masked]> writes:
>> Maybe  parsing "%c" looks too ambitius for the
>> freedoom of the output format.
>
> Also FWIW, parse-time-string won't parse (format-time-string "%c"
> (current-time)) correctly in many non-english locales because it won't
> recognize the month names.
>
> In my french setup:
> (format-time-string "%c" (current-time)) => "mar. 11 août 2015 07:34:35 CEST"
>
> "mar" stands for "mardi" (= Tuesday), but will be understood as "March" :
> (parse-time-string "mar. 11 août 2015 07:34:35 CEST") => (35 34 7 11 3 2015 nil nil nil)
>
>> We may need something like:
>>
>> once you find "am" "pm" look the token: "HH:MM:SS" and ask:
>>
>> when "pm" and HH < 12: HH ---> HH + 12
>
> Currently parse-time-string works with rules (they are found in
> parse-time-rules), each setting one element of a (SEC MIN HOUR DAY MON
> YEAR DOW DST TZ) list. When one such element is set, parse-time-string
> won't modify it anymore. So we need a small change in the design here if
> we want to take PM into account.
>
> -- 
> Nico
>

--- parse-time.el	2015-08-11 18:06:46.895638495 +0900
+++ parse-time_1.el	2015-08-11 19:19:20.855001776 +0900
@@ -182,7 +182,10 @@
 The values are identical to those of `decode-time', but any values that are
 unknown are returned as nil."
   (let ((time (list nil nil nil nil nil nil nil nil nil))
-	(temp (parse-time-tokenize (downcase string))))
+		(temp (parse-time-tokenize (downcase string)))
+		(has-pm nil))
+	(when (member "pm" temp)
+	  (setq has-pm t))
     (while temp
       (let ((parse-time-elt (pop temp))
 	    (rules parse-time-rules)
@@ -216,6 +219,8 @@
 				       (funcall this)))
 				 parse-time-val)))
 		  (rplaca (nthcdr (pop slots) time) new-val))))))))
+	(when (and has-pm (< (nth 2 time) 12))
+	  (setf (nth 2 time) (+ (nth 2 time) 12)))
     time))
 
 (provide 'parse-time)