Как реализовать Date.add (date, n,: month) в эликсире - PullRequest
0 голосов
/ 26 июня 2019

Было бы неплохо иметь это в стандартной библиотеке Elixir, но мы этого не делаем.

Date.add(date, n, :month) # where n could be +/-

Как бы вы это реализовали?

Это похоже на хорошую отправную точку:https://stackoverflow.com/a/53407676/44080

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Вы можете использовать реализацию Timex :

  defp shift_by(%NaiveDateTime{:year => year, :month => month} = datetime, value, :months) do
    m = month + value
    shifted =
      cond do
        m > 0 ->
          years = div(m - 1, 12)
          month = rem(m - 1, 12) + 1
          %{datetime | :year => year + years, :month => month}
        m <= 0 ->
          years = div(m, 12) - 1
          month = 12 + rem(m, 12)
          %{datetime | :year => year + years, :month => month}
      end

    # If the shift fails, it's because it's a high day number, and the month
    # shifted to does not have that many days. This will be handled by always
    # shifting to the last day of the month shifted to.
    case :calendar.valid_date({shifted.year,shifted.month,shifted.day}) do
      false ->
        last_day = :calendar.last_day_of_the_month(shifted.year, shifted.month)
        cond do
          shifted.day <= last_day ->
            shifted
          :else ->
            %{shifted | :day => last_day}
        end
      true ->
        shifted
    end
  end

Timex использует лицензию MIT , так что вы сможете включить это практически в любой проект.

0 голосов
/ 27 июня 2019

Есть функция эликсира Date.add/2.Дайте ему любую дату, и он добавит даты для вас.

iex>Date.add(~D[2000-01-03], -2)
~D[2000-01-01]

Если вы хотите создать дату для добавления, то я предлагаю вам использовать Date.new/4

iex>{:ok, date} = Date.new(year, month, day) 
iex>date |> Date.add(n)
...