2011-09-08 13 views
2

私はErlangを学んでいます。時刻()出力をフォーマットされた時間文字列(HH:MM:SS)にする最良の方法は何ですか? 。私が思いついた コードは次のとおりです。時間()をHH:MM:SS文字列として取得する

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

それはゼロ分または秒とパッドではないので、このコードは正確にトリックを行うことはありません。また、++演算子を使用して、推奨されないリストを連結します。

Erlangでこの簡単なタスクを実装する正しい方法は何ですか?

答えて

12

正しい、わかりやすい実装は(printfのようなものです)formatを使用する:

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

~2..0bは、基数10で印刷される整数のプレースホルダーで、少なくとも2文字をとり、左には0という文字で埋められます。

参考文献:

(フォーマットは文書化されている場所)タイトなループで関数を呼び出すことができます。プロファイリングベンチマークでは、関数が実際にボトルネックになっていることが示されます。

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

私はDave Harveys dh_dateモジュールが好きです。必要な唯一の "修正"は、format/2がnow()またはdatetime()だけを取ることです。以下の例のように簡単に修正。

4> dh_date:format("H:i:s",{{0,0,0},time()}). 
"07:23:58" 
関連する問題