Time in Clojure

(ns time-example
  (:require [clojure.java.io :as io]
            [java-time :as t]))

(defn print-time-info []
  (let [now (t/instant)
        then (t/instant "2009-11-17T20:34:58.651387237Z")
        p println]
    
    ; We'll start by getting the current time.
    (p now)
    
    ; You can build a time struct by providing the year, month, day, etc.
    ; Times are always associated with a time zone.
    (p then)
    
    ; You can extract the various components of the time value as expected.
    (p (t/year then))
    (p (t/month then))
    (p (t/day-of-month then))
    (p (t/hour then))
    (p (t/minute then))
    (p (t/second then))
    (p (t/nano-of-second then))
    (p (t/zone-id then))
    
    ; The Monday-Sunday weekday is also available.
    (p (t/day-of-week then))
    
    ; These methods compare two times, testing if the first occurs before,
    ; after, or at the same time as the second, respectively.
    (p (t/before? then now))
    (p (t/after? then now))
    (p (= then now))
    
    ; The duration between method returns a Duration representing
    ; the interval between two times.
    (let [diff (t/duration then now)]
      (p diff)
      
      ; We can compute the length of the duration in various units.
      (p (t/as :hours diff))
      (p (t/as :minutes diff))
      (p (t/as :seconds diff))
      (p (t/as :nanos diff))
      
      ; You can use plus to advance a time by a given duration,
      ; or with a minus to move backwards by a duration.
      (p (t/plus then diff))
      (p (t/minus then diff)))))

(print-time-info)

This Clojure code demonstrates various time-related operations using the java-time library, which provides a more idiomatic Clojure interface to Java 8’s date and time API.

Here’s a breakdown of the operations:

  1. We start by getting the current time using (t/instant).
  2. We create a specific time using (t/instant "2009-11-17T20:34:58.651387237Z").
  3. We extract various components of the time (year, month, day, etc.) using corresponding functions from java-time.
  4. We compare times using before?, after?, and =.
  5. We calculate the duration between two times and extract it in various units (hours, minutes, seconds, nanoseconds).
  6. We demonstrate adding and subtracting durations from times.

To run this program, save it to a file (e.g., time_example.clj) and execute it using a Clojure runtime. The output will show various time-related information and calculations.

Note that Clojure, being a JVM language, leverages Java’s robust time handling capabilities, which are similar in power to Go’s time package.