【问题标题】:Erlang - How Can I Parse RFC1123 Dates Into An Erlang Term?Erlang - 如何将 RFC1123 日期解析为 Erlang 术语?
【发布时间】:2014-03-16 16:18:43
【问题描述】:

如果不使用第三方模块,我需要采取哪些步骤来转换它:

<<"Mon, 17 Feb 2014 11:07:53 GMT">>

进入这个?:

[17, 2, 2014, 10, 07, 53]

我在 Google 上搜索的大多数答案都建议使用库。 到目前为止,我怀疑我会通过模式匹配格式化的日期字符串来到达某个地方。

类似:

<<_:5/binary, Date:2/binary>> = <<"Mon, 17 Feb 2014 11:07:53 GMT">>...

我认为应该产生以下“匹配”

Date = 17...

这是基于在这里找到的一个想法 - https://groups.google.com/forum/#!topic/erlang-programming/OpXSqt3U86c - 这是一个好方法吗?

是否有任何 BIF 或模块可以帮助解决这个问题? 此外,我如何将“Feb”转换/映射为整数?

【问题讨论】:

    标签: parsing date functional-programming erlang


    【解决方案1】:

    让我们在 shell 中尝试一下:

    1> <<_:5/binary, Date:2/binary>> = <<"Mon, 17 Feb 2014 11:07:53 GMT">>.
    ** exception error: no match of right hand side value <<"Mon, 17 Feb 2014 11:07:53 GMT">>
    

    对,我们需要同时匹配二进制文件的其余部分:

    2> <<_:5/binary, Date:2/binary, Rest/binary>> = <<"Mon, 17 Feb 2014 11:07:53 GMT">>.
    <<"Mon, 17 Feb 2014 11:07:53 GMT">>
    3> Date.
    <<"17">>
    

    所以现在Date 是一个包含 ASCII 数字 1 和 7 字节的二进制文件。我们可以使用 binary_to_integer 将其转换为数字:

    4> binary_to_integer(Date).
    17
    

    至于将月份名称转换为整数,通常的方法是使用函数:

    month_name_to_integer("Jan") -> 1;
    month_name_to_integer("Feb") -> 2;
    ...
    month_name_to_integer("Dec") -> 12.
    

    【讨论】:

    • 太棒了!谢谢!。完全忘记了匹配总是必须相等的事实。很好的答案。 :) 至于“month_name_to_integer”,使用“case”语句不是更有效吗?
    • 请注意,使用此方法时,您必须确保月份中的日期始终为 2 位数字,以及其他日期字段(“星期一,2014 年 2 月 3 日 01:07:03 GMT”) .
    • @Charlie function 子句和 case 子句都被编译成相同的 BEAM 代码,所以这纯粹是关于偏好和品味。
    【解决方案2】:

    您可以使用tempo 库进行日期时间格式化和解析。

    【讨论】:

      【解决方案3】:
      Bin = <<"Mon, 17 Feb 2014 11:07:53 GMT">>,
      L = binary_to_list(Bin),
      {match, Res} = 
          re:run(L, "[0-9]+", [global, {capture, all, list}]),
      [list_to_integer(X) || [X] <- Res].
      

      输出是:

      [17,2014,11,7,53]
      

      【讨论】:

      • 是的。这是非常好的。虽然数组顺序不正确。当我第一次问这个问题时,我至少知道一些日期解析库,但是 1:必须破解一个应用程序组件才能使用一个(Couch DB),以及 2:认为这将是一个很好的方法了解有关最佳实践的更多信息。所以我非常感谢这样的答案。图书馆名称不会受到伤害。 :}
      【解决方案4】:

      为什么要受苦?为什么不用第三方模块?

      我用erlware_commons

      ec_date:parse("Mon, 17 Feb 2014 11:07:53 GMT").

      【讨论】:

        猜你喜欢
        • 2012-03-14
        • 2011-10-05
        • 2013-02-14
        • 1970-01-01
        • 2016-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多