[erlang-questions] When the heck is now -

José Valim jose.valim@REDACTED
Fri Oct 21 11:21:14 CEST 2016


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. 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 <erlang@REDACTED> 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
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20161021/aa57a4d0/attachment.htm>


More information about the erlang-questions mailing list