我有以下函数返回当前日期:
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])
答案 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 question和this 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}}
)是需要它来确定日期格式。