When I’ll have an access to my computer I’ll write full code, but idea is the following
- Calculate day of the week for the first day of the month e.g. “2021-03-01”
- Calculate the distance to the nearest Friday (number in range 0:6)
- Add 14
- Add result to the first day of the month
UPD:
function thirdfriday(dt)
dt = floor(Date(dt), Month)
dt |> dayofweek |>
(x -> 5 - x < 0 ? 12 - x : 5 - x) |>
(x -> x + 14) |>
(x -> dt + Day(x))
end
julia> dr = Date(2021):Month(1):Date(2022);
julia> thirdfriday.(dr)
13-element Vector{Date}:
2021-01-15
2021-02-19
2021-03-19
2021-04-16
2021-05-21
2021-06-18
2021-07-16
2021-08-20
2021-09-17
2021-10-15
2021-11-19
2021-12-17
2022-01-21
It should be efficient, I suppose, since it adds no allocations, pure arithmetic.
It was interesting to read Dates documentation, there are interesting tonext and toprev functions as well as filter. So, if you are not afraid of iterations, at least they can be written in a very compact form
julia> tonext(x -> (dayofweek(x) == 5) && (dayofweekofmonth(x) == 3), Date("2020-03-01"))
2020-03-20
julia> dr = Date(2021):Day(1):Date(2022)
Date("2021-01-01"):Day(1):Date("2022-01-01")
julia> filter(dr) do x
(dayofweek(x) == 5) && (dayofweekofmonth(x) == 3)
end
12-element Vector{Date}:
2021-01-15
2021-02-19
2021-03-19
2021-04-16
2021-05-21
2021-06-18
2021-07-16
2021-08-20
2021-09-17
2021-10-15
2021-11-19
2021-12-17