基于日期药剂在主机之间切换

时间:2018-10-03 05:46:31

标签: datetime elixir

我们有三种类型的主机,在它们上面运行文件系统并保存jpeg。最初,我们有一个主机localhost:8888,早于{{2017, 10, 31}, {23, 59, 59}},我们开始处理2个主机,新主机是localhost:8889

  def point_to_seaweed(request_date) do
    oct_date =
      {{2017, 10, 31}, {23, 59, 59}}
      |> Calendar.DateTime.from_erl!("UTC")

    case Calendar.DateTime.diff(request_date, oct_date) do
      {:ok, _, _, :after} -> "localhost:8889"
      _ -> "localhost:8888"
    end
  end

每当请求日期大于{{2017, 10, 31}, {23, 59, 59}}时,我们就会切换到新主机。但是现在在{{2018, 10, 31}, {23, 59, 59}}上,我们要更改为新主机,但也需要同时处理所有2个旧主机。

我尝试过这个。

  def point_to_seaweed(request_date) do
    oct_date =
      {{2017, 10, 31}, {23, 59, 59}}
      |> Calendar.DateTime.from_erl!("UTC")

    case Calendar.DateTime.diff(request_date, oct_date) do
      {:ok, secs, _, :after} ->
        case secs > 31536000 do
          true -> "localhost:8890"
          false -> "localhost:8889"
        end
      _ -> "localhost:8888"
    end
  end

这是更好的方法吗? 31536000已经一年了。这可以用另一种方法吗?

1 个答案:

答案 0 :(得分:2)

为此,我将使用内置的NaiveDateTime模块并定义一个辅助函数,以检查Erlang日期是否早于另一个Erlang日期:

def before?(date1, date2) do
  NaiveDateTime.diff(NaiveDateTime.from_erl!(date1), NaiveDateTime.from_erl!(date2)) < 0
end

然后使用cond

def point_to_seaweed(request_date) do
  port = cond do
    before?(request_date, {{2017, 10, 31}, {23, 59, 59}}) -> 8888
    before?(request_date, {{2018, 10, 31}, {23, 59, 59}}) -> 8889
    true -> 8890
  end
  "localhost:#{port}"
end