【问题标题】:Parse string to get date and time in a specific format in Clojure在 Clojure 中解析字符串以获取特定格式的日期和时间
【发布时间】:2016-08-14 15:15:21
【问题描述】:

我刚开始玩wit/duckling。它是用 Clojure 编写的,我以前没有使用 Clojure 的经验。我需要将像 2016-08-14T19:45:48.000+05:30 这样的字符串解析为像 1945hrs, Sunday, August 14th 2016 这样的格式。我在互联网上搜索并遇到了 lib clj-time。经过很长时间的挣扎,我遇到了这个thread,并认为 rfc822 是我的一杯茶。所以我使用了格式化程序 rfc822 但它给了我例外:

java.lang.IllegalArgumentException: Invalid format: "2016-08-16T00:00:00.000+05:30"

这是我的代码:

(ns firstproj.core
  (:gen-class)
  (:require [duckling.core :as p])
  (:require [clj-time.format :as f]))

(defn -main
  "I don't do a whole lot."
  [x]
  (p/load! { :languages ["en"]})
  (def var_ (p/parse :en$core x [:time]))
  (def date_string "2016-08-14T19:45:48.000+05:30")
  (f/parse (f/formatters :rfc822) date_string))

所以谁能告诉我我在这里做错了什么。或 Clojure 中的任何其他方式来获得我想要的日期时间格式。由于我对 Clojure 非常幼稚,所以请您详细回答,这将有助于我更好地理解这一点。谢谢。

【问题讨论】:

  • 您使用的是 Java 8 吗?
  • @SamEstep 是的,我使用的是 Java 8。
  • 好的,太好了;在这种情况下,我相信我的回答是解决您问题的最佳方法。

标签: clojure clj-time


【解决方案1】:

clj-time 库是 Joda-Time 的包装器。如果您使用的是 Java 8,您应该更喜欢内置的 java.time 库而不是 Joda-Time,原因解释为 here。在 Clojure 中,您可以使用包装 java.timeClojure.Java-Time 库。首先,将其添加到您的依赖项中:

[clojure.java-time "0.2.1"]

然后你可以在java-time命名空间中使用offset-date-timeformat函数:

(require '[java-time :as time])

(->> (time/offset-date-time "2016-08-14T19:45:48.000+05:30")
     (time/format "HHmm'hrs', EEEE, MMMM d y"))
;;=> "1945hrs, Sunday, August 14 2016"

正如@Piotrek 在他的回答中指出的那样,Joda-Time 似乎不支持您最初问题中的“th”。从DateTimeFormatter 文档来看,java.time 也没有。

【讨论】:

    【解决方案2】:

    如果不实际检查哪个预定义的格式化程序与您的日期格式匹配,您可能只是调用:

    (f/parse "2016-08-14T19:45:48.000+05:30")
    ;; => #object[org.joda.time.DateTime 0x1bd11b14 "2016-08-14T14:15:48.000Z"]
    

    它将尝试所有预定义的格式化程序并从第一个成功的格式化程序返回解析值。

    然后以您的自定义格式打印:

    (require '[clj-time.core :as t])
    
    (def my-time-zone (t/time-zone-for-offset 5 30))
    
    (def my-formatter
      (f/formatter
        "HHmm'hrs', EEEE, MMMM dd yyyy"
        my-time-zone))
    
    (f/unparse my-formatter some-date)
    ;; => "1945hrs, Sunday, August 14 2016"
    

    不幸的是,据我所知,JodaTime 不处理诸如添加 stndrdth 之类的事情到几天。

    【讨论】:

    • 我已经更新了我的答案。默认情况下,日期使用 UTC 进行解析和未解析,因此之前的输出是针对 UTC 打印的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 2014-03-31
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 2019-09-14
    相关资源
    最近更新 更多