6

我查看了以下问题: How to add days to current date in 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
4

4 回答 4

6

parse返回 a java.util.Date,您看到的错误是告诉您不能将 aDate转换为 a Number。您可以getTime用来获取 a 的毫秒数Date

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

可能会增加 7 天的日期。如果您想增加90 天,则需要将 7 替换为 90,如下所示(* 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))
于 2015-02-06T03:57:30.360 回答
4

如果可以避免的话,我不建议在新代码中使用旧的日期和时间 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)
于 2016-03-14T21:20:23.667 回答
2

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定义:years, months, weeks, days, hours, minutes, seconds.


生成的 JodaDateTime对象可以很容易地被操作,例如以毫秒为单位的 unix epoch:

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

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

=> 1484150620067

于 2016-10-13T16:22:25.610 回答
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)))))
于 2017-09-10T16:39:55.383 回答