如何在 Clojure 中为日期添加天数
How do I add days to a date in Clojure
我看过以下问题:
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 天,然后将其转换回字符串格式?我根据上面的link尝试了这个:
(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
parse
returns a java.util.Date
,您看到的错误告诉您不能将 Date
转换为 Number
。您可以使用 getTime
获取 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))
如果可以避免,我不建议在新代码中使用遗留日期和时间 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)
clj-time 有 from-now
和 ago
:
(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
.
生成的 Joda DateTime
对象可以很容易地被操作,例如以毫秒为单位的 unix 纪元:
(require '[clj-time.core :refer [days from-now]])
(require '[clj-time.coerce :as coerce])
(coerce/to-long (-> 90 days from-now))
=> 1484150620067
这个解决方案returns一个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)))))
我看过以下问题: 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 天,然后将其转换回字符串格式?我根据上面的link尝试了这个:
(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
parse
returns a java.util.Date
,您看到的错误告诉您不能将 Date
转换为 Number
。您可以使用 getTime
获取 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))
如果可以避免,我不建议在新代码中使用遗留日期和时间 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)
clj-time 有 from-now
和 ago
:
(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
.
生成的 Joda DateTime
对象可以很容易地被操作,例如以毫秒为单位的 unix 纪元:
(require '[clj-time.core :refer [days from-now]])
(require '[clj-time.coerce :as coerce])
(coerce/to-long (-> 90 days from-now))
=> 1484150620067
这个解决方案returns一个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)))))