我使用new Date()
在JavaScript中保存了一些日期,如下所示:
“ 2019年2月24日星期日格林尼治标准时间+0200(东欧标准时间)”
我正在尝试将其解析为Elixir DateTime
;我没有在“ timex”中找到任何可以帮助的东西,并且我已经知道可以使用DateTime.from_iso8601
,但是对于使用new Date().toISOString()
保存的日期,我需要解析上面的字符串。
预先感谢
答案 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)>