2015-02-06 85 views
4

我看了以下問題: How to add days to current date in clojure我如何在Clojure中添加日期

但是,我對Clojure非常陌生,而且我遇到以下情況,我得到字符串格式的時間戳。所以我用解析了下列文件:

(.parse (java.text.SimpleDateFormat. "yyyy-MM-dd") date) 

,給了我一個結果,看起來像這樣:

#inst "2015-02-13T00:20:00.000-00:00" 

如何添加說,90天這一點,然後將其轉換回字符串格式?我想這基於上面的鏈接:

(java.util.Date. (+ (* 7 86400 1000) 
        (.parse (java.text.SimpleDateFormat. "yyyy-MM-dd") date))) 

這給了我以下錯誤:

ClassCastException java.util.Date cannot be cast to java.lang.Number clojure.lang.Numbers.add 
+0

最好使用[喬達時間](http://www.joda.org/) joda-time /)而不是默認的Java日期/時間庫。還有一個Clojure包裝器,[clj-time](https://github.com/clj-time/clj-time)。請參閱此[IBM Developer Works文章](http://www.ibm.com/developerworks/java/library/j-jodatime/index.html#N100BA)以獲取有關爲何Joda Time是更好選項的詳細信息。 – 2015-02-06 10:16:36

回答

3

parse返回java.util.Date,您所看到的錯誤是告訴你,你不能施放DateNumber。您可以使用getTime得到Date的毫秒:

(java.util.Date. (+ (* 7 86400 1000) 
       (.getTime (.parse (java.text.SimpleDateFormat. "yyyy-MM-dd") date)))) 

潛在增加了7天的日期。如果你想潛在添加90天,你需要用90代替7,像這樣:(* 90 86400 1000)

您還可以使用java.util.Calendar

(let [cal (Calendar/getInstance) 
     d (.parse (java.text.SimpleDateFormat. "yyyy-MM-dd") date)] 
    (doto cal 
    (.setTime d) 
    (.add Calendar/DATE 90) 
    (.getTime))) 

或者更好的是,clj-time

(require '[clj-time.core :as t]) 
(require '[clj-time.format :as f]) 

(t/plus (f/parse (f/formatters :year-month-day) date) 
     (t/days 90)) 
+0

哦對不起7天和90天的事情。這是一個錯字。 – newbie 2015-02-06 04:02:22

+3

「這增加了7天的日期」---如果只有每個人都是'86400'秒,這並非總是如此 – zerkms 2015-02-06 04:25:28

+0

@zerkms你是正確的,我編輯了答案。謝謝! – 2015-02-06 04:40:01

1

我不建議使用新代碼遺留日期和時間API,如果你能避免它。

的Java 8帶來了新的API,使用它可以優雅地表達這個問題日期:

(let [date-format java.time.format.DateTimeFormatter/ISO_LOCAL_DATE] 
    (.. (java.time.LocalDate/parse "2015-02-13" date-format) 
     (plusDays 90) 
     (format date-format))) 

甚至,把所有的快捷鍵:

(-> (java.time.LocalDate/parse "2015-02-13") (.plusDays 90) str) 
1

clj-timefrom-nowago

(require '[clj-time.core :refer [days from-now]]) 

(-> 90 days from-now) 

=> #object[org.joda.time.DateTime 0x4d8bcee3 "2017-01-11T16:03:40.067Z"]

(require '[clj-time.core :refer [hours ago]]) 

(-> 7 hours ago) 

=> #object[org.joda.time.DateTime 0x3eef2142 "2016-10-13T09:19:01.246Z"]

推介PeriodType定義:yearsmonthsweeksdayshoursminutesseconds


將所得約達DateTime對象可以容易地被操縱,例如在UNIX時期以毫秒爲單位:

(require '[clj-time.coerce :as coerce]) 

(coerce/to-long (-> 90 days from-now)) 

=> 1484150620067

0

將該溶液返回java.util.Date

(defn add-days-to-instant [num-days ^java.util.Date d] 
    (.getTime (let [cal (Calendar/getInstance)] 
       (doto cal 
       (.setTime d) 
       (.add Calendar/DATE num-days)))))