将JavaScript日期解析为Elixir格式

时间:2019-02-24 12:49:24

标签: date datetime elixir

我使用new Date()在JavaScript中保存了一些日期,如下所示:

“ 2019年2月24日星期日格林尼治标准时间+0200(东欧标准时间)”

我正在尝试将其解析为Elixir DateTime;我没有在“ timex”中找到任何可以帮助的东西,并且我已经知道可以使用DateTime.from_iso8601,但是对于使用new Date().toISOString()保存的日期,我需要解析上面的字符串。

预先感谢

2 个答案:

答案 0 :(得分:1)

您可以使用elixir二进制模式匹配来提取日期部分,并使用Timex的RFC1123格式进行解析。 RFC1123的格式为e.g Tue, 05 Mar 2013 23:25:19 +0200。在iex中运行h Timex.Format.DateTime.Formatters.Default以查看其他格式。

iex> date_string = "Sun Feb 24 2019 14:44:20 GMT+0200 (Eastern European Standard Time)"

iex> <<day_name::binary-3,_,month_name::binary-3,_,day::binary-2,_,year::binary-4,_,time::binary-8,_::binary-4,offset::binary-5,_,rest::binary>> = date_string

iex> Timex.parse("#{day_name}, #{day} #{month_name} #{year} #{time} #{offset}", "{RFC1123}")

iex> {:ok, #DateTime<2019-02-24 14:44:20+02:00 +02 Etc/GMT-2>}

模式匹配: 二进制大小以字节为单位。 1个字节== 1个字符。例如获得  3个字符的day_name大小为3。下划线(_)用于对日期格式中的空格进行模式匹配

已更新答案,以使用binary-size而不是位串大小来简化

答案 1 :(得分:1)

  

在“ timex”中我找不到任何可以帮助您的东西

Timex Parsing docs表示您可以使用strftime序列(例如%H:%M:%S)进行解析。以下是strftime characters及其匹配项的列表。

这是我认为应该在javascript日期上可以使用的格式字符串:

  def parse_js_date() do
    Timex.parse!("Sun Feb 24 2019 14:44:20 GMT+0200 (Eastern European Standard Time)", 
                 "%a %b %d %Y %H:%M:%S GMT%z (%Z)",
                 :strftime)
  end

不幸的是,%Z不想匹配时区名称,这导致Timex.parse!()吐出一个错误。看起来Elixir中的%Z仅匹配一个单词,例如时区缩写EET。因此,我简单,干净的解决方案被宠坏了。

可以做的是在解析日期字符串之前将时区名称砍掉:

def parse_js_date_string() do

    [date_str|_tz_name] = String.split(
        "Sun Feb 24 2019 14:44:20 GMT+0200 (Eastern European Standard Time)",
        " (", 
        parts: 2
    )

    Timex.parse!(date_str,
                 "%a %b %d %Y %H:%M:%S GMT%z",
                :strftime)
  end

在iex中:

~/elixir_programs/my$ iex -S mix
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Compiling 1 file (.ex)
Interactive Elixir (1.6.6) - press Ctrl+C to exit (type h() ENTER for help)

iex(1)> My.parse_js_date_string()
#DateTime<2019-02-24 14:44:20+02:00 +02 Etc/GMT-2>

iex(2)> 
相关问题