0

所以我刚开始使用 Elixir 并看到当前master添加了~U[2015-01-13 13:00:07Z]对创建/解析 UTC 日期的印记的支持。

代码如下:

defmodule MySigils do
  defmacro sigil_U(datetime_string, modifiers)

  defmacro sigil_U({:<<>>, _, [string]}, []) do
    Macro.escape(datetime_from_utc_iso8601!(string))
  end

  defp datetime_from_utc_iso8601!(string) do
    case DateTime.from_iso8601(string) do
      {:ok, utc_datetime, 0} ->
        utc_datetime

      {:ok, _datetime, _offset} ->
        raise ArgumentError,
              "cannot parse #{inspect(string)} as UTC datetime, reason: :non_utc_offset"

      {:error, reason} ->
        raise ArgumentError,
              "cannot parse #{inspect(string)} as UTC datetime, reason: #{inspect(reason)}"
    end
  end
end

在我的代码中,我试图将它与变量一起使用timestamp

timestamp = Map.get(item, "timestamp")
~U[timestamp]
** (ArgumentError) cannot parse "timestamp" as UTC datetime, reason: :invalid_format

timestamp被解释为原样,而不是前一场比赛。

有没有办法让它工作?我需要引用/取消引用某些内容吗?除了DateTime.from_iso8601/1直接使用。

4

1 回答 1

1

印记分隔符之间的所有内容都作为字符串发送。所以timestamp变量sigil_U作为字符串发送到"timestamp"。有一些允许插值的符号,按照惯例是小写的。例如~r~R

iex(1)> x = "foo"
"foo"

iex(2)> ~R/#{x}/
~r/\#{x}/

iex(3)> ~r/#{x}/
~r/foo/

但在这种情况下,没有定义小写版本的 ,sigil_U因此您不能插值timestamp.

于 2019-03-06T19:34:49.203 回答