nasıl

2013-07-09 5 views
13

#inst olarak zaman yazdırmak için bu değişmez bir tarih okumak kolaydır:nasıl

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

Nasıl I çıkışı #inst... değişmez olarak bir tarih?

Bu işe yaramazsa:

(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

Clojure 1.5.1 kullanıyorum, REPL '(java.util.Date.)' Print'larda #inst "#inst" yazarak aşağıdakini giriyorum. 2013-07-09T18: 05: 53.231-00: 00 ". –

+0

Not: clj-time.core/now', Joda olan bir DateTime nesnesidir. – Jeremy

+0

Oh, anladım, benim hatam. Teşekkürler :). 'DateTime'ı' java.util.Date'’e dönüştürme ve daha sonra bastırma nedir? –

cevap

11

sen okurken bir #inst literal, varsayılan olarak, bir java.util.Date örneği oluşturulur. Bunlar, clojure.instant ad alanındaki print-method (nesnelerin basılı gösterimlerinden sorumlu bir multimethod) için tanımlanan bir yönteme sahiptir (1.5.1 kaynağının ilgili parçası here'dur).

clj-time, DateTime türünde, hiçbir özel print-method yöntemine sahip olan Joda-Time ürününü kullanır. Bu bir anlam ifade etmektedir, çünkü gidiş gelişi olmayan bir sunum üreten bir print-method olması nadiren istenmektedir. Gidiş-dönüş yapabilmek için standart olmayan bir #inst okuyucusu kullanmanız gerekir. CLJ zamanı kullanırken

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

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

, your-inst-reader#(clj-time.format/parse some-formatter %) gibi bir şey olacaktır: Eğer edn verileri okuyorsanız onun docstringe belgelenen olarak Bunu başarmak için, size clojure.edn/read (veya read-string) uygun okuyucuyu geçirerek kullanabilirsiniz . Daha sonra clojure.instant örneğini izleyerek eşleşen bir print-method tanımını sağlayabilirsiniz. (Ya da sadece print-method tanımını sağlayabilir ve mükemmel bir yuvarlaklaştırma yapamayacağınızı unutmayın; clj-time çok uygun baskı işlevleri sağlar - aşağıya bakın - bu tamam olabilir.)

Alternatif olarak, yazdırabilirsiniz. java.util.Date örneklerini okuyun ve bunları DateTime s adresine dönüştürün; Bunu clj-time.coerce'da yapmak için işlevler vardır.

+0

java.util.Date adresine yazdım. –

+1

Genel bir çözüm sağlamanın mümkün olup olmadığını önceden sordum: https://github.com/clj-time/clj-time/issues/93 – Jacob

+0

Bekleyin, böylece bir zaman damgasını nasıl * #inst olarak yazdırabilirim? YYYY-AA ... "'? –