Получить в следующем месяце в эликсире - PullRequest
0 голосов
/ 28 ноября 2018

В моем последнем вопросе , на который ответил Алексей , я пытался найти предыдущий месяц для данной даты.Сейчас я пытаюсь сделать наоборот:

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

1 Ответ

0 голосов
/ 28 ноября 2018

Ваш подход верен, хотя вы можете использовать методы 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
...