Skip to content

Instantly share code, notes, and snippets.

@souenzzo
Created January 13, 2021 11:33
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save souenzzo/b18bbe3aabc9bc04720670b5c0668cc0 to your computer and use it in GitHub Desktop.
Save souenzzo/b18bbe3aabc9bc04720670b5c0668cc0 to your computer and use it in GitHub Desktop.
(defn resolve-field
[sym]
(let [field-name (name sym)
field ^Field (first (filter
#(= field-name
(.getName ^Field %))
(.getDeclaredFields (Class/forName (namespace sym)))))]
(when field
(.setAccessible field true)
(.get field (.getType field)))))
(def SECONDS-PER-DAY
(delay
(resolve-field `LocalTime/SECONDS_PER_DAY)))
(def NANOS-PER-SECOND
(delay
(resolve-field `LocalTime/NANOS_PER_SECOND)))
(defn- ^LocalDate local-date-of-instant
"Backport da JDK9
https://github.com/openjdk/jdk/commit/9322c398b57dbc04abf14d7f7256a2904ed55ee4#diff-31475327219b454cf634a7cd526c2619R311
"
[^Instant instant ^ZoneId zone]
(let [rules (.getRules zone)
offset (.getOffset rules instant)
local-second (+ (.getEpochSecond instant)
(.getTotalSeconds offset))
local-epoch-day (Math/floorDiv
(long local-second)
(long @SECONDS-PER-DAY))]
(LocalDate/ofEpochDay local-epoch-day)))
(defn- ^LocalTime local-time-of-instant
[^Instant instant ^ZoneId zone]
(let [offset (.getOffset (.getRules zone) instant)
local-second (+ (.getEpochSecond instant)
(.getTotalSeconds offset))
secs-of-day (Math/floorMod (long local-second)
(long @SECONDS-PER-DAY))]
(LocalTime/ofNanoOfDay (+ (* secs-of-day @NANOS-PER-SECOND)
(.getNano instant)))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment