2013-07-09 7 views
13

Thật dễ dàng để đọc một ngày đen:Làm thế nào để in thời gian như #inst

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

Làm thế nào tôi có thể ra một ngày như một #inst... đen?

này không hoạt động:

(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

Tôi đang sử dụng clojure 1.5.1, nhập thông tin sau vào REPL '(java.util.Date.)' In '#inst" 2013-07-09T18: 05: 53.231-00: 00 "'. –

+0

Lưu ý rằng 'clj-time.core/now' là một đối tượng DateTime, là Joda. – Jeremy

+0

Ồ, tôi hiểu rồi, sai lầm của tôi. Cảm ơn :). Điều gì về việc chuyển đổi 'DateTime' thành' java.util.Date' và sau đó in nó? –

Trả lời

11

Khi bạn đọc trong một #inst đen, theo mặc định, một trường hợp java.util.Date được tạo ra. Chúng có phương thức được xác định cho print-method (một phương thức đa phương thức chịu trách nhiệm cho các biểu diễn đối tượng được in) trong không gian tên clojure.instant (đoạn có liên quan của nguồn 1.5.1 là here).

thời gian clj sử dụng loại DateTime từ thời gian Joda, không có phương pháp tùy chỉnh print-method được thiết lập. Điều này làm cho tinh thần, kể từ khi có một print-method trong đó sản xuất một đại diện mà không khứ hồi là hiếm khi mong muốn. Để cho chuyến đi khứ hồi, bạn phải sử dụng trình đọc không chuẩn #inst. Để đạt được điều đó, nếu bạn đang đọc dữ liệu edn, bạn có thể sử dụng clojure.edn/read (hoặc read-string) đi qua người đọc thích hợp trong như tài liệu trong docstring của nó:

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

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

Khi sử dụng CLJ thời gian, your-inst-reader sẽ giống như #(clj-time.format/parse some-formatter %) . Sau đó, bạn có thể cung cấp định nghĩa phù hợp với print-method theo ví dụ về clojure.instant. (Hoặc bạn chỉ có thể cung cấp định nghĩa print-method và nhớ rằng bạn sẽ không nhận được vòng quay hoàn hảo; clj-time cung cấp chức năng cưỡng chế rất thuận tiện - xem bên dưới - vì vậy điều này có thể được chấp nhận.)

Hoặc bạn có thể in và đọc java.util.Date phiên bản và chuyển đổi chúng thành và từ DateTime s; có chức năng để làm điều đó trong clj-time.coerce.

+0

Tôi đã kết thúc với việc sử dụng java.util.Date. –

+1

Tôi đã hỏi ngược dòng nếu có thể cung cấp giải pháp chung: https://github.com/clj-time/clj-time/issues/93 – Jacob

+0

Đợi, vậy làm cách nào để in dấu thời gian là '#inst ' YYYY-MM ... "? –