Date 将javascript日期解析为elixir格式

Date 将javascript日期解析为elixir格式,date,datetime,elixir,Date,Datetime,Elixir,我在JavaScript中使用new Date()保存了一些日期,如下所示: “2019年2月24日星期日14:44:20 GMT+0200(东欧标准时间)” 我试图将这些解析为ElixirDateTime;我在“timex”中找不到任何有帮助的东西,我已经知道我可以使用DateTime.from_iso8601但是对于使用new Date().toISOString()保存的日期,我需要的是解析上面的字符串 提前感谢您可以使用elixir二进制模式匹配来提取日期部分,并使用Timex的RFC1

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

“2019年2月24日星期日14:44:20 GMT+0200(东欧标准时间)”

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


提前感谢

您可以使用elixir二进制模式匹配来提取日期部分,并使用Timex的
RFC1123
格式进行解析。RFC1123的格式为
,例如2013年3月5日星期二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>}

iex>date\u string=“2019年2月24日星期日14:44:20 GMT+0200(东欧标准时间)”
iex>=日期字符串
iex>Timex.parse(“{day}、{day}、{month}、{year}、{time}、{offset}、{RFC1123}”)
iex>{:好的,#日期时间}
模式匹配: 二进制大小以字节大小为单位。1字节==1个字符。比如说 3个字符
day\u name
大小为3。下划线(\)用于模式匹配日期格式中的空格

为简单起见,更新了答案以使用
二进制大小
而不是位字符串大小

我在“timex”里找不到任何有用的东西

假设您可以使用
strftime
序列进行解析,例如
%H:%M:%S
。这是一个列表,以及它们的匹配项

下面是一个格式字符串,我认为它应该适用于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)> 
~/elixir\u程序/my$iex-S混合版
Erlang/OTP 20[erts-9.3][source][64位][smp:4:4][ds:4:4:10][async threads:10][hipe][kernel poll:false]
正在编译1个文件(.ex)
交互式长生不老药(1.6.6)-按Ctrl+C退出(键入h()回车以获取帮助)
iex(1)>My.parse_js_date_string()
#日期时间
iex(2)>