使用timex和elixir创建季度间隔

使用timex和elixir创建季度间隔,elixir,Elixir,我正在尝试创建季度间隔,类似于使用此代码创建月度间隔的方式 [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月第一季度、4月至6月第二季度、7月至9

我正在尝试创建季度间隔,类似于使用此代码创建月度间隔的方式

[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月第一季度、4月至6月第二季度、7月至9月第三季度、10月至12月第四季度。我可以通过将月份四舍五入到季度的第一个日期并增加三个月来实现这一点,但我想知道是否有内置的功能来完成季度。

如果您总是希望从所提供年份的乞讨中获得季度,您可以这样做:

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”]

顺便说一句,您实际上不需要在原始行中使用带有步骤/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))

多亏了马里奥,他帮助简化了代码。这是我最终完成的代码

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)}"

不幸的是,我不能从年初开始,我需要从开始日期所在的季度开始。所以,看起来我需要得到当前的季度和增量。谢谢你的提示。@Michaelsclair请检查更新的答案。虽然Timex没有办法建立季度间隔,但它确实有办法获得所提供日期的当前季度感谢您的帮助,这比使用ceil和创建新日期更简洁。另外,您可以使用
Timex.quarter/1
清理
calculate\u quarter/1
函数,该函数返回该日期的季度<代码>“Q{Timex.quarty(date)}{Timex.format!(date,“%Y”,:strftime)}”
仅供参考,
calculate_quarty/1
将永远不会得到任何其他月份1、4、7和10 btw的数据,因为您正在按季度间隔输入它。我还将它用于其他日期,这些日期不会从间隔开始,以查看它们进入哪个季度。谢谢你的四分之一功能!