Fork me on GitHub
#juxt
<
2020-06-18
>
Joe17:06:54

I'm using this function with tick to return the 'last day of the month 3 months from now' - is there a more elegant way to do this?

(defn next-period-date [date]
  (str
    (t/- (apply t/new-date
                (let [new-month (+ 1 (mod (+ 3 (t/int (t/month date))) 12))]
                  [(if (< new-month 5)
                     (inc (t/int (t/year date)))
                     (t/int (t/year date)))
                   new-month
                   1]))
         (t/new-period 1 :days))))

dvingo18:06:25

I have first-of-month and last-of-month helpers - then i'd combine that with (t/new-period 3 :months)

dvingo18:06:01

(defn first-day-of-month
  ([] (first-day-of-month (t/today)))
  ([date] (-> (t/new-date (int-year date) (int-month date) 1)
            (t/at (t/midnight)))))

(defn last-day-of-month
  "date - tick/date or similar"
  ([] (last-day-of-month (t/today)))
  ([date]
   (let [the-first (first-day-of-month date)]
     (t/end (t/bounds the-first
              (t/- (t/+ the-first (t/new-period 1 :months))
                (t/new-period 1 :days)))))))

(last-day-of-month (t/+ (t/today) (t/new-period 3 :months)))

tomd20:06:33

@allaboutthatmace1789 I think you want to be looking at t/year-month like so:

(defn next-period-date [date]
  (-> (t/+ date (t/new-period 3 :months))
      t/year-month
      t/end
      (t/- (t/new-period 1 :days))
      t/date))
it's a bit annoying that we need to subtract a day as the penultimate step, but then I guess the end of a month is technically considered to be in the next month 🤷

tomd21:06:08

@danvingo fyi that means your first-day-of-month fn can be shortened to this:

(def first-day-of-month (comp t/date t/beginning t/year-month))

dvingo21:06:20

very nice, thanks @tomd

🙂 3
Joe22:06:35

Nice, thanks both!