我的日期和时间输入为"2016-09-08"和"3:45 PM".我想使用clojure函数将它们作为2016 09 08 3 45返回
我用replace函数删除特殊字符并减少组合.但那变成了一个字符串而不是一个整数.我尝试过使用格式化程序功能,但没有用.
你能帮我吗.
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库还提供与多个日期/时间相关类型的转换,以及提供丰富的日期/时间算术和比较库,并支持本地日期/时间以及世界标准时间.
归档时间: |
|
查看次数: |
193 次 |
最近记录: |