Clojure:
Comparing two dates
How to:
Clojure uses the Java interop capabilities to handle dates. Let’s roll up our sleeves and dive in:
;; Import Java Date class
(import java.util.Date)
;; Create two date instances
(def date1 (java.util.Date.))
(Thread/sleep 1000) ;; Wait a bit
(def date2 (java.util.Date.))
;; Compare the dates
(println (.before date1 date2)) ; true, date1 is before date2
(println (.after date1 date2)) ; false, date1 is not after date2
(println (.equals date1 date2)) ; false, date1 is not the same as date2
Sample output might look like this, but with different time stamps:
true
false
false
Deep Dive
In the past, Clojure developers often used Java’s Date
for date operations, invoking methods using the dot operator as seen earlier. Alternatives include clj-time
, a Clojure library wrapping Joda-Time.
An example using clj-time
would look like this:
;; Add clj-time to your project dependencies
(require '[clj-time.core :as time])
(require '[clj-time.coerce :as coerce])
;; Create two date-time instances
(def date-time1 (time/now))
(Thread/sleep 1000) ;; Wait a second
(def date-time2 (time/now))
;; Compare using clj-time functions
(println (time/before? date-time1 date-time2)) ; true
(println (time/after? date-time1 date-time2)) ; false
(println (time/equal? date-time1 date-time2)) ; false
Clojure’s stance on time is leveraging Java’s libraries, while clj-time integrates with Joda-Time for a more idiomatic Clojure experience.
Since Java 8, the java.time
package—inspired by Joda-Time—is the preferred way to deal with dates and times in Java and, by extension, in Clojure through interop. Improved design and additional capabilities like time zones make java.time
a robust choice.