2013-07-09 13 views
13

Łatwo odczytać datę dosłowne:Jak drukować czas jako #inst

(read-string "#inst \"2012\"") 
     ;;; ⇒ #inst "2012-01-01T00:00:00.000-00:00" 

Jak mogę wyjście data jako #inst... dosłowne?

To nie działa:

(pr-str (clj-time.core/now)) 
     ;;; ⇒ "#<DateTime 2013-07-09T17:26:30.058Z>" 

(read-string (pr-str (clj-time.core/now))) 
     ;;; ⇒ <err> 
     ;;; RuntimeException Unreadable form clojure.lang.Util.runtimeException (Util.java:219) 
+0

Używam clojure 1.5.1, wprowadzając następujące w REPL '(java.util.Date.) Drukuje' #inst "2013-07-09T18: 05: 53.231-00: 00" '. –

+0

Zauważ, że 'clj-time.core/now' jest obiektem DateTime, którym jest Joda. – Jeremy

+0

O, widzę, mój błąd. Dzięki :). A co z konwersją 'DateTime' na' java.util.Date', a następnie wydrukowanie? –

Odpowiedz

11

Kiedy odczytano w #inst dosłowny, domyślnie instancja java.util.Date jest tworzony. Mają one metodę zdefiniowaną dla print-method (multimetod odpowiedzialny za drukowane reprezentacje obiektów) w przestrzeni nazw clojure.instant (odpowiedni fragment źródła 1.5.1 to here).

clj-time używa typu DateTime od Joda-Time, który nie ma niestandardowej konfiguracji metody print-method. Ma to sens, ponieważ rzadko kiedy pożądane jest posiadanie reprezentacji, która nie odbywa się w obie strony. Aby mógł się odbyć w obie strony, musisz użyć niestandardowego czytnika #inst. Aby to osiągnąć, jeśli czytasz dane EDN, można użyć clojure.edn/read (lub read-string) uboczny odpowiedniego czytnika w co zostało udokumentowane w docstring:

(require '[clojure.edn :as edn]) 

(edn/read {:readers {'inst your-inst-reader}} rdr) 

Podczas korzystania CLJ wymiarze godzin, your-inst-reader będzie coś jak #(clj-time.format/parse some-formatter %) . Następnie można podać pasującą definicję print-method na przykładzie clojure.instant. (Możesz też podać definicję print-method i pamiętać, że nie uzyskasz idealnego okrążenia, clj-time zapewnia bardzo wygodne funkcje koercji - patrz poniżej - więc może być ok.)

Alternatywnie możesz wydrukować i przeczytać instancje java.util.Date i przekonwertować je na i od DateTime s; istnieją funkcje do wykonania tego w clj-time.coerce.

+0

Skończyłem na przymuszaniu do java.util.Date. –

+1

Pytałem wcześniej, czy możliwe jest zapewnienie ogólnego rozwiązania: https://github.com/clj-time/clj-time/issues/93 – Jacob

+0

Czekaj, więc jak wydrukować znacznik czasu jako "#inst" RRRR-MM ... ""? –