help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: date parsing


From: Ehud Karni
Subject: Re: date parsing
Date: Tue, 10 Aug 2004 19:32:12 +0300

On Tue, 10 Aug 2004 18:18:35 +0300, Yoni Rabkin Katzenell <yoni-r@actcom.com> 
wrote:
>
> I'm looking for an Emacs Lisp function library for parsing
> human-readable dates. It seems that Emacs can parse RFC 1123 dates (for
> Emails) but no other human-readable formats.

I don't know why you say that. Look at at gnus/parse-time.el,
change the value of `parse-time-rules' by adding (just) 1 element:

(setq parse-time-rules
  `(((6) parse-time-weekdays)
    ((3) (1 31))
    ((4) (1 12))                   ;;Added element by Ehud Karni
    ((4) parse-time-months)
    ((5) (100 4038))
    ((2 1 0)
     ,#'(lambda () (and (stringp elt)
                        (= (length elt) 8)
                        (= (aref elt 2) ?:)
                        (= (aref elt 5) ?:)))
     [0 2] [3 5] [6 8])
    ((8 7) parse-time-zoneinfo
     ,#'(lambda () (car val))
     ,#'(lambda () (cadr val)))
    ((8)
     ,#'(lambda ()
          (and (stringp elt)
               (= 5 (length elt))
               (or (= (aref elt 0) ?+) (= (aref elt 0) ?-))))
     ,#'(lambda () (* 60 (+ (parse-integer elt 3 5)
                            (* 60 (parse-integer elt 1 3)))
                      (if (= (aref elt 0) ?-) -1 1))))
    ((5 4 3)
     ,#'(lambda () (and (stringp elt)
                        (= (length elt) 10)
                        (= (aref elt 4) ?-)
                        (= (aref elt 7) ?-)))
     [0 4] [5 7] [8 10])
    ((2 1 0)
     ,#'(lambda () (and (stringp elt) (= (length elt) 5) (= (aref elt 2) ?:)))
     [0 2] [3 5] ,#'(lambda () 0))
    ((2 1 0)
     ,#'(lambda () (and (stringp elt)
                        (= (length elt) 4)
                        (= (aref elt 1) ?:)))
     [0 1] [2 4] ,#'(lambda () 0))
    ((2 1 0)
     ,#'(lambda () (and (stringp elt)
                        (= (length elt) 7)
                        (= (aref elt 1) ?:)))
     [0 1] [2 4] [5 7])
    ((5) (50 110) ,#'(lambda () (+ 1900 elt)))
    ((5) (0 49) ,#'(lambda () (+ 2000 elt)))))

and check this by evaluating the following:

  (parse-time-string "10/01/2004  11:22:33")
  (parse-time-string "10/Jan/2004 11:22:33")
  (parse-time-string "2004-01-10  11:22:33")
  (parse-time-string "10/1/2004   11:22:33")
  (parse-time-string "10 Jan 2004 11:22:33")
  (parse-time-string "Jan 10 2004 11:22:33")
  (parse-time-string "2004 Jan 10 11:22:33")
  (parse-time-string "10 Jan 04 11:22:33")
  (parse-time-string "10/01/04  11:22:33")
  (parse-time-string "10/Jan/04 11:22:33")
  (parse-time-string "10/1/04   11:22:33")
  (parse-time-string "11:22:33 10/01/2004")
  (parse-time-string "11:22:33 10/Jan/2004")
  (parse-time-string "11:22:33 2004-01-10")
  (parse-time-string "11:22:33 10/1/2004")

each of these gives: (33 22 11 10 1 2004 nil nil nil)

`parse-time-string' fails when you use only 1 digit for the
month or day, or 2 digits for the year in the Y-M-D format.
i.e.  (parse-time-string "11:22:33 04-01-10") ==>
      (33 22 11 nil nil nil nil nil nil)

If you have other "human readable" format just check them.

Ehud.


--
 Ehud Karni           Tel: +972-3-7966-561  /"\
 Mivtach - Simon      Fax: +972-3-7966-667  \ /  ASCII Ribbon Campaign
 Insurance agencies   (USA) voice mail and   X   Against   HTML   Mail
 http://www.mvs.co.il  FAX:  1-815-5509341  / \
 GnuPG: 98EA398D <http://www.keyserver.net/>    Better Safe Than Sorry




reply via email to

[Prev in Thread] Current Thread [Next in Thread]