首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >take-while和java-time/iterate创建奇怪的结果

take-while和java-time/iterate创建奇怪的结果
EN

Stack Overflow用户
提问于 2019-03-03 22:58:02
回答 1查看 101关注 0票数 2

我使用的是0.3.2版的clojure.java-time,我有一个定义如下的TemporalAdjuster

代码语言:javascript
复制
(def next-pay-day
  (reify java.time.temporal.TemporalAdjuster
    (adjustInto [this temporal]
      (let [local-date (java.time.LocalDate/from temporal)
            day-of-month (j/as local-date :day-of-month)
            last-day-of-month (j/as (j/adjust local-date :last-day-of-month) :day-of-month)]
        (cond 
          (= day-of-month last-day-of-month) 
          (j/plus local-date (j/days 14))

          (< day-of-month 14) 
          (j/plus local-date (j/days (- 14 day-of-month)))

          :else 
          (j/adjust local-date :last-day-of-month))))))

它的工作原理如下:

代码语言:javascript
复制
=> (require '[pto-calculator.logic.pay-periods :as p])
nil
=> (require '[java-time :as j])
nil
=> (take 4 (j/iterate j/adjust (j/local-date 2019 3 3) p/next-pay-day))
(#object[java.time.LocalDate 0x74e53020 "2019-03-03"] #object[java.time.LocalDate 0x49980a "2019-03-14"] #object[java.time.LocalDate 0x2e332a36 "2019-03-31"] #object[java.time.LocalDate 0x5e7aaec6 "2019-04-14"])

我正在尝试生成一个从今天到t之间的发薪天数列表,t是未来的LocalDate。我有这个,但问题是它似乎在某些日期(4月15日)有效:

代码语言:javascript
复制
=> (take-while #(= 1 (compare (j/local-date 2019 4 15) %)) (j/iterate j/adjust (j/local-date 2019 3 3) p/next-pay-period))
(#object[java.time.LocalDate 0xc994eb6 "2019-03-03"] #object[java.time.LocalDate 0x3ec8e48 "2019-03-14"] #object[java.time.LocalDate 0x1bddd9d5 "2019-03-31"] #object[java.time.LocalDate 0x133ed931 "2019-04-14"])
; Last date is 2019-04-14 (expected)

但对其他人来说不是(4月18日):

代码语言:javascript
复制
=> (take-while #(= 1 (compare (j/local-date 2019 4 18) %)) (j/iterate j/adjust (j/local-date 2019 3 3) p/next-pay-period))
(#object[java.time.LocalDate 0x7f0ac64b "2019-03-03"] #object[java.time.LocalDate 0x1f1d3684 "2019-03-14"] #object[java.time.LocalDate 0x70415bc3 "2019-03-31"])
; Last date is 2019-03-31 (unexpected, should be 2019-04-14)

为什么操作会缩短到4月18日,但在4月15日却可以正常工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-04 00:08:30

compare并不总是返回1、0或-1。因此,不是:

代码语言:javascript
复制
#(= 1 (compare (j/local-date 2019 4 15) %))

尝试:

代码语言:javascript
复制
#(pos? (compare (j/local-date 2019 4 15) %))
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54970150

复制
相关文章

相似问题

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