[erlang-questions] When the heck is now -

Bengt Kleberg bengt.kleberg@REDACTED
Fri Oct 21 11:27:55 CEST 2016


Greetings,

My Erlang installation, Erlang/OTP 19 [erts-8.1], has 
calendar:local_time/0 and os:system_time/0. Both are easier to 
remember/find than going through all of the erlang module. IMHO.


bengt


On 10/21/2016 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. 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 <http://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 
> <mailto: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 <mailto:erlang-questions@REDACTED>
>     http://erlang.org/mailman/listinfo/erlang-questions
>     <http://erlang.org/mailman/listinfo/erlang-questions>
>
>
>
>
> _______________________________________________
> 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/8a2f3ff3/attachment.htm>


More information about the erlang-questions mailing list