1

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

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])
4

5 回答 5

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">>
于 2014-11-18T20:20:48.923 回答
0

您应该在二进制文件中添加分隔符或至少对其进行格式化,否则您将无法使用二进制文件 <<"2014129">> 区分 2014/12/09 和 2014/01/29。你可以使用:

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> 
于 2014-11-19T09:51:56.180 回答
0
{Y,M,D}=erlang:date().
list_to_binary( io_lib:format("~p~p~p", [Y,M,D]) ).

输出是<<"20141119">>

你可以试试这个方法。

于 2014-11-19T03:18:51.380 回答
0

根据这个问题这个问题的答案,尝试以下功能。

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>>.

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

于 2014-11-18T20:21:09.867 回答
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}}需要它来识别日期格式。

于 2015-07-25T18:21:39.763 回答