我尝试创建季度间隔,类似于我使用此代码创建每月间隔的方式
[from: start_date, until: end_date, right_open: false]
|> Timex.Interval.new()
|> Timex.Interval.with_step([months: 1])
|> Enum.map(&Timex.format!(&1, "%Y-%m", :strftime))
时间间隔应为1月至3月1日,4月至6月2日,7月至9月3季度,10月至12月季度。我可以通过将月份缩小到季度的第一个日期并增加三个月来实现这一目标,但我想知道是否有内置的功能来进行宿舍。
答案 0 :(得分:3)
如果你总是希望从提供的年份开始的季度,你可以这样做:
Timex.Interval.new(from: Timex.beginning_of_year(provided_date),
until: [years: 1],
right_open: false,
step: [months: 3])
|> Enum.map(&Timex.format!(&1, "%Y-%m", :strftime))
(这会返回["2018-01", "2018-04", "2018-07", "2018-10"]
)
顺便说一下,您实际上不需要在原始行中使用with_step/2
。您只需在更改原始步骤时使用该功能。您可以直接在new/1
中声明该步骤,就像我在上面的示例中所做的那样。
虽然Timex不会自动构建季度间隔,但它确实有办法获得日期所属的季度。如果你需要从当前季度开始,你可以这样做:
Timex.Interval.new(from: Timex.beginning_of_quarter(provided_date),
until: [years: 1],
right_open: false,
step: [months: 3])
|> Enum.map(&Timex.format!(&1, "%Y-%m", :strftime))
答案 1 :(得分:0)
感谢Mario,他帮助简化了代码。这是我最终完成的代码
def periods(start_date, end_date, "quarter") do
start_date = Timex.beginning_of_quarter(start_date)
[from: start_date, until: end_date, right_open: false, step: [months: 3]]
|> Interval.new
|> Enum.map(&calculate_quarter(&1))
end
def calculate_quarter(date), do: "Q#{Timex.quarter(date)} #{Timex.format!(date, "%Y", :strftime)}"