【问题标题】:Time compare in elixir phoenix framework长生不老药凤凰框架中的时间比较
【发布时间】:2018-09-26 14:13:50
【问题描述】:

我想从用户那里得到一个日期输入并比较(如果它是未来至少 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 时间? 我该怎么做?

谢谢

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    您首先不应将任何内容转换为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
    

    【讨论】:

    • build_datetime(date, time) 返回 {:error, :missing_offset} 我在这里错过了什么?
    • 哦,抱歉,我从您的 NaiveDateTime 实现中复制粘贴了参数,这里略有不同。固定。
    • 哦,谢谢!,还有 1 个问题,如果我使用 utc 时间,这意味着它可以在任何时区工作吗?比方说,如果我运行 DateTime.utc_now,它返回的不是我的本地时间,它返回 utc 时间并且它与本地时间不同,但我希望我的计划作业从现在开始在本地时间 10 分钟后运行。这是如何工作的?
    • 要正确使用时区,请使用requires tz_info database。但是在这里您不需要任何 TZ 信息,因为从现在开始的 10 分钟是 600 秒的差异,无论使用什么 TZ。
    • 如果用户选择不同时区的日期时间怎么办?我需要根据该日期时间安排工作吗?
    猜你喜欢
    • 2021-01-29
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多