Reputation: 243
I have the following function that returns current date:
7> {Y,M,D}=erlang:date().
{2014,11,18}
Now I need to have a binary with these values inside like this:
<<"20141118">>
I have tried
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])
Upvotes: 1
Views: 934
Reputation: 2612
Late response, but why not:
Another single line option using qdate (a project of mine):
qdate:to_string(<<"Ymd">>, {erlang:date(), {0,0,0}}).
qdate:to_string
's formatting option follows PHP's date()
function formatting conventions. The addition of {0,0,0} is necessary because a three-tuple is treated as an erlang timestamp (now()
format) while a two-tuple of three-tuples (ex: {{2015, 9, 30}, {15, 54, 39}}
) is needed for it to identify a date format.
Upvotes: 0
Reputation: 14042
You should add separators in your binary or at least format it otherwise you will not be able to make the difference between 2014/12/09 and 2014/01/29 with the binary <<"2014129">>. You could use:
list_to_binary(io_lib:format("~4w~2w~2w", [Y,M,D])). % which will add space when necessary
Or if you only want to store the information you can store each element as a 16 bit binary:
lists:foldr(fun(X,Acc) -> <<X:16,Acc/binary>> end,<<>>,[Y,M,D]). % the result is less friendly to read but easier to manipulate.
Result:
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>
Upvotes: 0
Reputation: 10254
{Y,M,D}=erlang:date().
list_to_binary( io_lib:format("~p~p~p", [Y,M,D]) ).
The output is <<"20141119">>
.
You can try this method.
Upvotes: 0
Reputation: 5208
Try the following function, based on the answers to this question, and 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>>.
This may not be the most efficient method, but it is probably the most explicit step by step conversion available out of the box.
Upvotes: 0
Reputation: 69
You can do it like this:
9> list_to_binary(lists:map(fun erlang:integer_to_list/1, [Y, M, D])).
<<"20141118">>
Or like this, which is equivalent but not really practical for larger lists:
10> list_to_binary([integer_to_list(Y), integer_to_list(M), integer_to_list(D)]).
<<"20141118">>
Upvotes: 1