【问题标题】:Get next month in Elixir下个月获得 Elixir
【发布时间】:2018-11-28 15:20:02
【问题描述】:

在我最后一次由Aleksei 回答的question 中,我试图找到给定日期的上个月。现在我正试图做相反的事情:

defmodule Dating do
  def next_month(%Date{year: year, month: month, day: day} = date) do
    first_day_of_next_month = Date.add(date, Calendar.ISO.days_in_month(year, month) - day + 1)
    %{year: year, month: month} = first_day_of_next_month
    Date.add(first_day_of_next_month, min(day, Calendar.ISO.days_in_month(year, month)) - 1)
  end
end

虽然代码可以正常工作,但我希望有更好的方法来做到这一点:

iex|1 ▶ Dating.next_month(~D[2018-12-31])
#⇒ ~D[2019-01-31]
iex|2 ▶ Dating.next_month(~D[2018-02-28])
#⇒ ~D[2018-03-28]
iex|3 ▶ Dating.next_month(~D[2018-01-31])
#⇒ ~D[2018-02-28]
iex|3 ▶ Dating.next_month(~D[2018-01-30])
#⇒ ~D[2018-02-28]

注意:请不要建议使用第三方 Elixir 软件包

【问题讨论】:

    标签: date datetime calendar erlang elixir


    【解决方案1】:

    您的方法是正确的,尽管您可以使用 Date 模块的方法使其更简洁,更易于阅读和理解:

    defmodule Dating do
      def next_month(%Date{day: day} = date) do
        days_this_month = Date.days_in_month(date)
        first_of_next   = Date.add(date, days_this_month - day + 1)
        days_next_month = Date.days_in_month(first_of_next)
    
        Date.add(first_of_next, min(day, days_next_month) - 1)
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多