Erlang:如何将erlang日期转换为二进制文件?

时间:2014-11-18 20:00:35

标签: date erlang tuples binaries

我有以下函数返回当前日期:

7> {Y,M,D}=erlang:date().
{2014,11,18}

现在我需要一个带有这些值的二进制文件,如下所示:

<<"20141118">>

我试过了

15> S= [Y,M,D].
[2014,11,18]
16> list_to_binary(S).
** exception error: bad argument
 in function  list_to_binary/1
    called as list_to_binary([2014,11,18])

5 个答案:

答案 0 :(得分:1)

你可以这样做:

9> list_to_binary(lists:map(fun erlang:integer_to_list/1, [Y, M, D])).
<<"20141118">>

或者像这样,这对于较大的列表来说是等效的但不是很实用:

10> list_to_binary([integer_to_list(Y), integer_to_list(M), integer_to_list(D)]).
<<"20141118">>

答案 1 :(得分:0)

根据this questionthis question的答案,尝试以下功能。

date_to_binary() ->
    {Y,M,D} = erlang:date(),
    BinY = list_to_binary(integer_to_list(Y)),
    BinM = list_to_binary(integer_to_list(M)),
    BinD = list_to_binary(integer_to_list(D)),
    <<BinY/binary, BinM/binary, BinD/binary>>.

这可能不是最有效的方法,但它可能是开箱即用的最明确的逐步转换。

答案 2 :(得分:0)

{Y,M,D}=erlang:date().
list_to_binary( io_lib:format("~p~p~p", [Y,M,D]) ).

输出为<<"20141119">>

您可以尝试此方法。

答案 3 :(得分:0)

您应该在二进制文件中添加分隔符或至少格式化它,否则您将无法使用二进制文件&lt;&lt;&lt;&#34; 2014129&#在2014/12/09和2014/01/29之间产生差异34;&GT;取代。 你可以使用:

list_to_binary(io_lib:format("~4w~2w~2w", [Y,M,D])).  % which will add space when necessary

或者如果您只想存储信息,可以将每个元素存储为16位二进制文​​件:

lists:foldr(fun(X,Acc) -> <<X:16,Acc/binary>> end,<<>>,[Y,M,D]). % the result is less friendly to read but easier to manipulate.

结果:

1> list_to_binary(io_lib:format("~4w~2w~2w",[2014,1,11])).   
<<"2014 111">>
2> lists:foldr(fun(X,Acc) -> <<X:16,Acc/binary>> end,<<>>,[2014,1,11]).
<<7,222,0,1,0,11>>
3> 

答案 4 :(得分:0)

迟到的反应,但为什么不呢:

使用qdate(我的一个项目)的另一个单行选项:

qdate:to_string(<<"Ymd">>, {erlang:date(), {0,0,0}}).

qdate:to_string的格式化选项遵循PHP的date()函数格式约定。添加{0,0,0}是必要的,因为三元组被视为erlang时间戳(now()格式),而三元组的两元组(例如:{{2015, 9, 30}, {15, 54, 39}})是需要它来确定日期格式。