2014-11-18 3 views
1

У меня есть следующая функция, которая возвращает текущую дату:Erlang: Как преобразовать дату erlang в двоичный?

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

ответ

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">> 
+0

считать использование integer_to_binary/1' более эффективным. – danechkin

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

Это не может быть наиболее эффективным методом, но это, вероятно, самый явный шаг за шагом преобразования доступного из коробки.

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

Выходной сигнал <<"20141119">>.

Вы можете попробовать этот метод.

0

Вы должны добавить разделители в свой двоичный формат или, по крайней мере, отформатировать его, иначе вы не сможете сделать разницу между 2014/12/09 и 2014/01/29 с двоичным кодом < < «2014129» >>. Вы могли бы использовать:

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

Поздний ответ , но почему бы и нет:

Другой вариант с одной строкой с использованием qdate (проект мой):

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

qdate:to_string «s форматирование вариант следует date() соглашения функция форматирования РНР. Добавление {0,0,0} необходимо, потому что три кортежа рассматриваются как временная метка erlang (формат now()), в то время как для набора формата даты требуется двухстрочный набор из трех кортежей (например: {{2015, 9, 30}, {15, 54, 39}}) ,