【问题标题】:parse javascript date to elixir format将javascript日期解析为长生不老药格式
【发布时间】:2019-02-26 13:37:59
【问题描述】:

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

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

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

提前致谢

【问题讨论】:

    标签: date datetime elixir


    【解决方案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-character day_name 大小为 3。下划线 (_) 用于模式匹配日期格式中的空格

    为简单起见,更新了使用 binary-size 而不是 bitstring-size 的答案

    【讨论】:

      【解决方案2】:

      我没有在“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)> 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-01
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多