Разбор строки для получения даты и времени в определенном формате в Clojure
Я только начал играть с остроумием / утенком. Он написан на Clojure, и у меня нет предыдущего опыта работы на Clojure. Мне нужно проанализировать строку, например 2016-08-14T19:45:48.000+05:30, в формат, например 1945, воскресенье, 14 августа 2016 года. Я искал в интернете и наткнулся на lib clj-time. После долгой борьбы с этим я наткнулся на эту тему и подумал, что 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, прошу вас подробно ответить, это поможет мне лучше понять это. Благодарю вас.
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 не обрабатывает такие вещи, как добавление st, nd, rd, th в дни.
clj-time
библиотека является оберткой для Joda-Time. Если вы используете Java 8, вы должны предпочесть встроенный java.time
библиотека по Joda-Time, по причинам, объясненным здесь. В Clojure вы можете использовать библиотеку Clojure.Java-Time, которая переносит java.time
, Сначала добавьте его в ваши зависимости:
[clojure.java-time "0.2.1"]
Тогда вы можете использовать offset-date-time
а также format
функции в java-time
Пространство имен:
(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
,