在clojure中结合日期和时间以返回瞬间

Kwa*_*wak 1 clojure

我的日期和时间输入为"2016-09-08"和"3:45 PM".我想使用clojure函数将它们作为2016 09 08 3 45返回

我用replace函数删除特殊字符并减少组合.但那变成了一个字符串而不是一个整数.我尝试过使用格式化程序功能,但没有用.

你能帮我吗.

Sea*_*eld 5

Clojure在其"标准库"中没有日期/时间解析,但有几个选项.最受欢迎的日期/时间库是clj-time,它是Joda Time(一个非常流行的Java库)的包装器.免责声明:我是clj-time的当前维护者之一,但在我介入之前很久它就是一个受欢迎且成熟的库.

在项目.clj(或build.boot)文件中添加clj-time作为依赖项,然后您需要强制命名和格式化名称空间:

(require '[clj-time.coerce :as tc]
         '[clj-time.format :as tf])
Run Code Online (Sandbox Code Playgroud)

您需要创建一个"格式化程序",以便在放在一起时匹配日期和时间字符串的语法.日期部分是直接的(yyyy-MM-dd),但由于你想解析时间部分的AM/PM部分,你需要考虑那里的12小时时钟(KK:mm aa):

(def my-date-time (str "2016-09-08" " " "3:45 PM"))
(def my-formatter (tf/formatter "yyyy-MM-dd KK:mm aa"))
Run Code Online (Sandbox Code Playgroud)

现在,您可以将字符串解析为Joda DateTime(UTC),然后将其转换为Java Date以在Clojure中生成即时文字:

(tc/to-date (tf/parse my-formatter my-date-time))
;=> #inst "2016-09-08T15:45:00.000-00:00"
Run Code Online (Sandbox Code Playgroud)

您也可以使用Java标准库SimpleDateFormat和TimeZone类直接通过Java interop执行此操作:

(def sdf (java.text.SimpleDateFormat. "yyyy-MM-dd KK:mm aa"))
(.setTimeZone sdf (java.util.TimeZone/getTimeZone "UTC"))
(.parse sdf my-date-time)
;=> #inst "2016-09-08T15:45:00.000-00:00"
Run Code Online (Sandbox Code Playgroud)

使用clj-time通常会产生更多惯用的Clojure.例如,在上面的Java代码中,您必须创建一个可变的SimpleDateFormat对象,然后通过返回void的方法将其时区更改为UTC.或者像这样依赖doto和Java interop:

(.parse (doto (java.text.SimpleDateFormat. "yyyy-MM-dd KK:mm aa")
              (.setTimeZone (java.util.TimeZone/getTimeZone "UTC")))
        my-date-time)
;=> #inst "2016-09-08T15:45:00.000-00:00"
Run Code Online (Sandbox Code Playgroud)

除了解析和格式化之外,clj-time库还提供与多个日期/时间相关类型的转换,以及提供丰富的日期/时间算术和比较库,并支持本地日期/时间以及世界标准时间.