Получение time () в виде строки HH: MM: SS - PullRequest
2 голосов
/ 09 сентября 2011

Я изучаю Эрланг и спрашиваю себя, как лучше всего превратить вывод time () в форматированную строку времени (ЧЧ: ММ: СС). Код, который я придумал:

my_time() ->
    {H, M, S} = time(),
    integer_to_list(H) ++ ":" ++ integer_to_list(M) ++ ":" ++ integer_to_list(S).

Этот код не справится с задачей точно так же, как он не заполнится нулями минут или секунд. Он также использует оператор ++ для объединения списков, что не рекомендуется.

Как правильно выполнить эту тривиальную задачу в Erlang?

Ответы [ 3 ]

12 голосов
/ 09 сентября 2011

Правильная, простая для понимания реализация использует format (что похоже на printf):

my_time() ->
    {H, M, S} = time(),
    io_lib:format('~2..0b:~2..0b:~2..0b', [H, M, S]).

~2..0b - это заполнитель для целого числа, которое будет напечатано в базе 10,занимает не менее 2 символов и дополняется слева символом 0.

Ссылки:

Вы должны беспокоиться о производительности, только если вызываете свою функцию в узком цикле, иесли тесты профилирования показывают, что ваша функция на самом деле является узким местом.

4 голосов
/ 09 сентября 2011

Я не знаю, почему вы думаете, что объединение списка с длиной 8 может быть любой проблемой, но если вы хотите быть очень быстрым, вы можете сделать:

my_time() ->
    {H, M, S} = time(),
    [$0 + H div 10, $0 + H rem 10, $:, $0 + M div 10, $0 + M rem 10, $:, $0 + S div 10, $0 + S rem 10].

Не существует правильных способов, есть более быстрые или медленные, более или менее потребляющие память и более или менее лаконичные решения.

Редактировать: Если вам нравится более краткая, но такая же производительность:

-define(DEC(X), $0 + X div 10, $0 + X rem 10).
my_time() ->
    {H, M, S} = time(),
    [?DEC(H), $:, ?DEC(M), $:, ?DEC(S)].
2 голосов
/ 09 сентября 2011

Мне нравится модуль Dave Harveys dh_date . Единственное «исправление» - это то, что format / 2 принимает только now () или datetime (). Легко исправляется, как в примере ниже.

4> dh_date:format("H:i:s",{{0,0,0},time()}).
"07:23:58"
...