我正在学习Erlang,我问自己什么是将time()输出转换为格式化时间字符串(HH:MM:SS)的最佳方法。 我想出的代码是:
my_time() ->
{H, M, S} = time(),
integer_to_list(H) ++ ":" ++ integer_to_list(M) ++ ":" ++ integer_to_list(S).
这段代码不会完全正确,因为它不会用分钟或秒来填充零。它还使用++运算符来连接不推荐的列表。
在Erlang中实现这个简单任务的正确方法是什么?
答案 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"