forked from clj-time/clj-time
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request clj-time#12 from r0man/coerce-protocol
Coerce protocol
- Loading branch information
Showing
2 changed files
with
128 additions
and
34 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,53 +1,99 @@ | ||
(ns clj-time.coerce | ||
"Utilites to coerce Joda DateTime instances to and from various other types. | ||
For example, to convert a Joda DateTime to and from a Java long: | ||
=> (to-long (date-time 1998 4 25)) | ||
893462400000 | ||
=> (from-long 893462400000) | ||
#<DateTime 1998-04-25T00:00:00.000Z>" | ||
(:refer-clojure :exclude [extend]) | ||
(:use clj-time.core) | ||
(:require [clj-time.format :as time-fmt]) | ||
(:import (org.joda.time DateTime DateTimeZone)) | ||
(:import java.util.Date)) | ||
(:import java.util.Date java.sql.Timestamp)) | ||
|
||
(defn to-long | ||
"Returns the number of milliseconds that the given DateTime is after Unix | ||
epoch." | ||
[#^DateTime dt] | ||
(.getMillis dt)) | ||
(defprotocol ICoerce | ||
(to-date-time [obj] "Convert `obj` to a Joda DateTime instance.")) | ||
|
||
(defn from-long | ||
"Returns a DateTime instance in the UTC time zone corresponding to the given | ||
number of milliseconds after the Unix epoch." | ||
[#^Long millis] | ||
(DateTime. millis #^DateTimeZone utc)) | ||
[#^Long millis] | ||
(DateTime. millis #^DateTimeZone utc)) | ||
|
||
(defn from-string | ||
"return DateTime instance from string using | ||
formatters in clj-time.format, returning first | ||
which parses" | ||
[s] | ||
(first | ||
(for [f (vals time-fmt/formatters) | ||
:let [d (try (time-fmt/parse f s) (catch Exception _ nil))] | ||
:when d] d))) | ||
|
||
(defn to-date | ||
"Returns a Java Date object corresponding to the given DateTime instance." | ||
[#^DateTime dt] | ||
(Date. #^Long (to-long dt))) | ||
(for [f (vals time-fmt/formatters) | ||
:let [d (try (time-fmt/parse f s) (catch Exception _ nil))] | ||
:when d] d))) | ||
|
||
(defn from-date | ||
"Returns a DateTime instance in the UTC time zone corresponding to the given | ||
Java Date object." | ||
[#^Date date] | ||
(from-long (.getTime date))) | ||
|
||
(defn to-long | ||
"Convert `obj` to the number of milliseconds after the Unix epoch." | ||
[obj] | ||
(if-let [dt (to-date-time obj)] | ||
(.getMillis dt))) | ||
|
||
(defn to-date | ||
"Convert `obj` to a Java Date instance." | ||
[obj] | ||
(if-let [dt (to-date-time obj)] | ||
(Date. (.getMillis dt)))) | ||
|
||
(defn to-string | ||
"Returns a string representation of date in UTC time-zone using | ||
(ISODateTimeFormat/dateTime) date-time representation. " | ||
[#^DateTime dt] | ||
(time-fmt/unparse (:date-time time-fmt/formatters) dt)) | ||
"Returns a string representation of obj in UTC time-zone | ||
using (ISODateTimeFormat/dateTime) date-time representation." | ||
[obj] | ||
(if-let [dt (to-date-time obj)] | ||
(time-fmt/unparse (:date-time time-fmt/formatters) dt))) | ||
|
||
(defn to-timestamp | ||
"Convert `obj` to a Java SQL Timestamp instance." | ||
[obj] | ||
(if-let [dt (to-date-time obj)] | ||
(Timestamp. (.getMillis dt)))) | ||
|
||
(extend-type nil | ||
ICoerce | ||
(to-date-time [_] | ||
nil)) | ||
|
||
(extend-type Date | ||
ICoerce | ||
(to-date-time [date] | ||
(from-date date))) | ||
|
||
(extend-type DateTime | ||
ICoerce | ||
(to-date-time [date-time] | ||
date-time)) | ||
|
||
(extend-type Integer | ||
ICoerce | ||
(to-date-time [integer] | ||
(from-long (long integer)))) | ||
|
||
(extend-type Long | ||
ICoerce | ||
(to-date-time [long] | ||
(from-long long))) | ||
|
||
(extend-type String | ||
ICoerce | ||
(to-date-time [string] | ||
(from-string string))) | ||
|
||
(extend-type Timestamp | ||
ICoerce | ||
(to-date-time [timestamp] | ||
(from-date timestamp))) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters