将time()检索为HH:MM:SS字符串

时间:2011-09-08 21:38:11

标签: erlang string-formatting

我正在学习Erlang,我问自己什么是将time()输出转换为格式化时间字符串(HH:MM:SS)的最佳方法。 我想出的代码是:

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

这段代码不会完全正确,因为它不会用分钟或秒来填充零。它还使用++运算符来连接不推荐的列表。

在Erlang中实现这个简单任务的正确方法是什么?

3 个答案:

答案 0 :(得分:12)

正确,易于理解的实施使用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

参考文献:

如果您在紧密循环中调用函数,并且分析基准测试表明您的函数实际上是瓶颈,那么您应该只担心性能。

答案 1 :(得分:4)

我不知道为什么你认为连接长度为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 :(得分:2)

我喜欢Dave Harveys dh_date模块。唯一需要的“修复”是format / 2只采用now()或datetime()。轻松修复,如下例所示。

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