首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Clojure中实现TemporalAdjuster

如何在Clojure中实现TemporalAdjuster
EN

Stack Overflow用户
提问于 2019-03-03 11:31:47
回答 1查看 86关注 0票数 1

Clojure菜鸟,这里。

我正在尝试在Clojure中实现一个TemporalAdjuster。我有以下几点:

代码语言:javascript
复制
(ns pto-calculator.logic.pay-periods
  (:require [java-time :as j]))

(def next-pay-period
  (reify java.time.temporal.TemporalAdjuster
    (adjustInto [this temporal]
      (let [local-date (java.time.LocalDate/from temporal)
            day-of-month (.getDayOfMonth local-date)]
        (if (< 14 day-of-month)
          (j/plus local-date (j/days (- 14 day-of-month)))
          (j/adjust local-date :last-day-of-month))))))

(defn get-next-pay-period [date]
  (j/adjust date next-pay-period))

我这样称呼它:

代码语言:javascript
复制
(ns pto-calculator.core
  (:require [pto-calculator.logic.pay-periods :as p]
            [java-time :as j])
  (:gen-class))

(defn -main
  [& args]
  (p/get-next-pay-period j/local-date))

今天是3月2日,所以我预计get-next-pay-period会返回3月14日,然而,我得到了一个异常:

代码语言:javascript
复制
Caused by: java.lang.ClassCastException: java_time.local$local_date cannot be cast to java.time.temporal.Temporal
    at java_time.adjuster$adjust.invokeStatic(adjuster.clj:64)
    at java_time.adjuster$adjust.doInvoke(adjuster.clj:40)
    at clojure.lang.RestFn.invoke(RestFn.java:425)
    at pto_calculator.logic.pay_periods$get_next_pay_period.invokeStatic(pay_periods.clj:19)
    at pto_calculator.logic.pay_periods$get_next_pay_period.invoke(pay_periods.clj:18)

我的困惑是:(j/local-date)返回java.time.LocalDate的一个实例,这是一个Temporal (根据the docs)。那么,为什么这不起作用呢?

我也尝试过:

代码语言:javascript
复制
(defn get-next-pay-period [^java.time.temporal.Temporal date]
...

但在这种情况下,我会得到这个错误:

代码语言:javascript
复制
java_time.local$local_date cannot be cast to java.time.temporal.Temporal

java_time.local$local_datejava.time.LocalDate有什么区别吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-03 12:23:09

您没有在核心名称空间中调用java-time/local-date。您正在将一个函数传递给get-next-pay-period

而不是:

代码语言:javascript
复制
(defn -main
  [& args]
  (p/get-next-pay-period j/local-date))

尝试:

代码语言:javascript
复制
(defn -main
  [& args]
  (p/get-next-pay-period (j/local-date)))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54965307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档