erlang: теперь на отметку времени и обратно - PullRequest
4 голосов
/ 29 февраля 2012

В моем проекте erlang: теперь преобразуется в метку времени высокой точности (bigint) для хранения в MySQL:

timestamp({Mega, Secs, Micro}) ->
    Mega*1000*1000*1000*1000 + Secs * 1000 * 1000 + Micro.

Теперь я конвертирую метку времени обратно в исходный кортеж {Mega, Secs, Micro}, используя:

time_tuple(Timestamp) ->
    TimeList = erlang:integer_to_list(Timestamp),
    Mega = erlang:list_to_integer(string:substr(TimeList, 1, 4)),
    Sec = erlang:list_to_integer(string:substr(TimeList, 5, 6)),
    Micro = erlang:list_to_integer(string:substr(TimeList, 11, 6)),
    {Mega, Sec, Micro}.

Преобразование строк / substr выглядит как уродливый и, возможно, некорректный хак. Что было бы более элегантным способом?

1 Ответ

14 голосов
/ 29 февраля 2012

Я могу что-то упустить, но почему бы вам не использовать для этого деление и модуль?

> {Mega, Sec, Micro} = now().
> Timestamp = Mega * 1000000 * 1000000 + Sec * 1000000 + Micro.
> {Mega1, Sec1, Micro1} = {Timestamp div 1000000000000, 
                            Timestamp div 1000000 rem 1000000,
                            Timestamp rem 1000000}.
...