Разбор строки для получения даты и времени в определенном формате в 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,

Другие вопросы по тегам