Elixir Phoenix框架中的时间比较

时间:2018-09-25 15:37:47

标签: elixir phoenix-framework

我想从用户那里获取一个日期输入并比较(如果它至少未来30分钟)是否为将来,并将其保存到数据库中。 来自用户输入的日期是这样的2018-09-26 用户输入的时间是这样的16:00 所以我将其转换为朴素的日期时间

def build_naive_datetime(date, time) do
  {:ok, datetime} = NaiveDateTime.from_iso8601("#{date} #{time}:00")
  datetime
end

因此它返回~N[2018-09-26 16:00:00]

,我想比较一下。

def schedule_datetime_is_future?(schedule_datetime) do
    # 30 mins future from now on
    future_datetime = DateTime.to_naive(Timex.add(Timex.now, Timex.Duration.from_minutes(30)))
    case Timex.compare(schedule_datetime, future_datetime) do
      1 ->
        # schedule datetime is future
        true
      -1 ->
        # schedule datetime is not future
        false
      _ ->
        false
    end
  end

但是Timex.now返回我的开发计算机时区时间(也许返回utc)。 因此比较无法正常进行。(用户输入的日期时间是本地时间。) 我怎样才能更好地做到这一点? 我是否必须将用户日期时间更改为UTC时间? 我该怎么办?

谢谢

1 个答案:

答案 0 :(得分:2)

首先,您不应将任何内容转换为NaiveDateTime,因为纯朴的日期时间根本没有时区(因此没有名称)。

您可能应该使用DateTime.diff/3

def build_datetime(date, time) do
  with {:ok, datetime, 0} <- DateTime.from_iso8601("#{date}T#{time}:00Z"),
    do: datetime
end

def schedule_datetime_is_future?(schedule_datetime) do
  DateTime.diff(schedule_datetime, DateTime.utc_now) > 30 * 60
end