Thanks to everyone for their suggestions. This is what I have used finally:

(defn parse-date [date-str]
  (when-not (blank? date-str)
    (let [clean-date-str (trim date-str)
          parse-or-nil
            (fn [format]
              (try
                (.parse format clean-date-str)
                (catch java.text.ParseException e nil)))]
      (some parse-or-nil
        [full-date-format date-format-wo-tz short-date-format-wo-tz]))))

Using some is better than using map because it will stop at the first
successful parsing.

Regards,
Abhinav

On Sat, Jul 31, 2010 at 3:05 AM, ataggart <[email protected]> wrote:

> Untested, but maybe this:
>
> (def- parse-date [date-str]
>  (when-not (blank? date-str)
>    (let [date-str (trim date-str)]
>      (take 1
>        (filter identity
>          (map #(try (.parse % date-str) (catch ParseException e nil))
>            [full-date-format date-format-wo-tz short-date-format-wo-
> tz]))))))
>
> WARNING: SimpleDateFormat is not thread-safe, so it's probably a bad
> idea to stick one in a shared context like def.
>
>
> On Jul 29, 10:35 pm, abhinav sarkar <[email protected]> wrote:
> > Hi,
> > I am just starting to learn Clojure by writing a small library. I came
> > across a situation in which I have to parse a String for getting a Date.
> Now
> > the string can be in one of the three formats. So I wrote this functions
> to
> > parse it:
> >
> > (def #^{:private true :tag SimpleDateFormat} full-date-format
> >   (doto (SimpleDateFormat. "EEE, dd MMMM yyyy HH:mm:ss +0000")
> >     (.setTimeZone (TimeZone/getTimeZone "GMT"))))
> >
> > (def #^{:private true :tag SimpleDateFormat} date-format-wo-tz
> >   (doto (SimpleDateFormat. "EEE, dd MMMM yyyy HH:mm:ss")
> >     (.setTimeZone (TimeZone/getTimeZone "GMT"))))
> >
> > (def #^{:private true :tag SimpleDateFormat} short-date-format-wo-tz
> >   (doto (SimpleDateFormat. "dd MMM yyyy, HH:mm")
> >     (.setTimeZone (TimeZone/getTimeZone "GMT"))))
> >
> > (defn- parse-date [date-str]
> >   (if (some #(% date-str) [nil? blank?])
> >     nil
> >     (let [clean-date-str (trim date-str)]
> >       (try
> >         (.parse full-date-format clean-date-str)
> >         (catch java.text.ParseException e
> >           (try
> >             (.parse date-format-wo-tz clean-date-str)
> >             (catch java.text.ParseException e
> >               (.parse short-date-format-wo-tz clean-date-str))))))))
> >
> > I can't help but think that there must be a better way to do the same
> > without so many nested try catch blocks. If this were Java, I could have
> > looped over all the date formats and used an explicit return in the try
> > block and continue in catch block. I don't understand how to do explicit
> > return in Clojure.
> >
> > Also as the number of formats grows, I'll have to add more nested try
> catch
> > blocks. Please suggest a cleaner way to do this.
> >
> > Regards,
> > Abhinav
>
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to [email protected]
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> [email protected]<clojure%[email protected]>
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to