[erlang-questions] When the heck is now -

Joe Armstrong <>
Fri Oct 21 12:33:27 CEST 2016


My problem is converting the return value of erlang:system_time() to a
local correct printable time that agrees with my clock.

The value of erlang:local_lime() is irrelevant - the program I am talking to
(SonicPi) reads the same clock as the erlang:system() reads - we need
to clock sync
on this value in a distributed system where other nodes might have
badly adjusted
clocks - so all I want to do is convert the return value of
erlang:local_time() to local time units for debugging purposes.


On Fri, Oct 21, 2016 at 11:21 AM, José Valim
<> wrote:
> Hello Joe,
>
> erlang:localtime() will return the local time as a {date, time} tuple
> according to your OS clock. As you mentioned, erlang:system_time() is the
> POSIX time which is UTC (UTC-ish since POSIX time doesn't account for leap
> seconds).
>
> Also Erlang 19.1 has added support for second, millisecond, microsecond, etc
> as units. Previously they were seconds, milli_seconds, micro_seconds, etc
> which did not agree with the SI convention.

> Therefore I believe you are
> reading the documentation for the most recent Erlang version while using an
> older version.

This could be true - I'll have to check.

Actually my erlang is <the latest>-1 (or 2) and my documentation is
what google found for me


> You could try the latest Erlang or use the now deprecated
> "seconds" and "micro_seconds" units instead of the correct "second" and
> "microsecond".
>
>
> José Valim
> www.plataformatec.com.br
> Skype: jv.ptec
> Founder and Director of R&D
>
> On Fri, Oct 21, 2016 at 4:30 AM, Joe Armstrong <> wrote:
>>
>> When is now?
>>
>> I want the raw uncorrected system time - I assume this is
>>
>>    erlang:system_time()
>>
>> Seems to return the raw system clock in nanosconds past Epoch
>>
>> I want to convert this to a printable local time that agrees with my
>> wristwatch (ie what the man on the Clapham omnibus might call the
>> time)
>>
>> So I'd like to convert this to
>> Year,Month,Day,Hour,Min,Sec,Fraction of sec
>>
>> There seems to be no function to do this (strange since,
>> this seems to me to be a common thing one might want to do).
>>
>> In the old days I'd write:
>>
>> t1() ->
>>     T1 = erlang:timestamp(),
>>     calendar:now_to_local_time(T1).
>>
>> This works fine:
>>
>>  > t1:t1().
>>   {{2016,10,21},{9,59,59}}
>>
>> After scratching my head and reading the manual pages
>> I ended up with this:
>>
>> t2() ->
>>     T1 = erlang:system_time(),
>>     system_time_to_ymdhms(T1).
>>
>> system_time_to_ymdhms(T) ->
>>     S = erlang:convert_time_unit(T, native, seconds),
>>     {Days, X} = calendar:seconds_to_daystime(S),
>>     {Y,Month,Day} = calendar:gregorian_days_to_date(Days),
>>     {{Y+1970,Month,Day}, X}.
>>
>> Now stunningly obvious - and wrong by 2 hours
>> (The erlang manual page is WRONG - it's seconds (plural) not second)
>>
>>    > t1:t1().
>>    {{2016,10,21},{10,18,32}}
>>    > t1:t2().
>>    {{2016,10,21},{8,18,34}}
>>
>> The erlang manual page also says
>>
>> QUOTE
>> The erlang:timestamp() BIF is equivalent to:
>>
>> timestamp() ->
>>    ErlangSystemTime = erlang:system_time(microsecond),
>>    MegaSecs = ErlangSystemTime div 1000000000000,
>>    Secs = ErlangSystemTime div 1000000 - MegaSecs*1000000,
>>    MicroSecs = ErlangSystemTime rem 1000000,
>>    {MegaSecs, Secs, MicroSecs}.
>>
>>
>> Which is totally incorrect since it crashes
>>
>> t3() ->
>>     T1 = timestamp(),
>>     calendar:now_to_local_time(T1).
>>
>> timestamp() ->
>>     ErlangSystemTime = erlang:system_time(microsecond),
>>     MegaSecs = ErlangSystemTime div 1000000000000,
>>     Secs = ErlangSystemTime div 1000000 - MegaSecs*1000000,
>>     MicroSecs = ErlangSystemTime rem 1000000,
>>     {MegaSecs, Secs, MicroSecs}.
>>
>> > t1:t3().
>> ** exception error: bad argument
>>      in function  erlang:system_time/1
>>         called as erlang:system_time(microsecond)
>>      in call from t1:timestamp/0 (t1.erl, line 26)
>>      in call from t1:t3/0 (t1.erl, line 22)
>>
>> At which point I'm flummoxed - the erlang manual page is totally wrong
>> in several places. The routines in calendar are not in phase with the
>> changes in time routine.
>>
>> And I still can't convert erlang:system_time() to my local time
>> since it's two hour wrong
>>
>> /Joe
>> _______________________________________________
>> erlang-questions mailing list
>> 
>> http://erlang.org/mailman/listinfo/erlang-questions
>
>


More information about the erlang-questions mailing list