Number of seconds since January 1, 1970 00:00:00 GMT Erlang
Asked Answered
J

2

5

I am interacting with a Remote Server. This Remote Server is in a different Time Zone. Part of the Authentication requires me to produce the:

"The number of seconds since January 1, 1970 00:00:00 GMT
The server will only accept requests where the timestamp
is within 600s of the current time"

The documentation of erlang:now(). reveals that it can get me the the elapsed time since 00:00 GMT, January 1, 1970 (zero hour) on the assumption that the underlying OS supports this. It returns a size=3 tuple, {MegaSecs, Secs, MicroSecs}. I tried using element(2,erlang:now()) but the remote server sends me this message:

Timestamp expired: Given timestamp (1970-01-07T14:44:42Z)
not within 600s of server time (2012-01-26T09:51:26Z)
Which of these 3 parameters is the required number of seconds since Jan 1, 1970 ? What aren't i doing right ? Is there something i have to do with the universal time as in calendar:universal_time() ?

UPDATE
As an update, i managed to switch off the time-expired problem by using this:
seconds_1970()->
    T1 = {{1970,1,1},{0,0,0}},
    T2 = calendar:universal_time(),
    {Days,{HH,Mins,Secs}} = calendar:time_difference(T1,T2),
    (Days * 24 * 60 * 60) + (HH * 60 * 60) + (Mins * 60) + Secs.
However, the question still remains. There must be a way, a fundamental Erlang way of getting this, probably a BIF, right ?
Janijania answered 26/1, 2012 at 10:39 Comment(0)
H
10

You have to calculate the UNIX time (seconds since 1970) from the results of now(), like this:

{MegaSecs, Secs, MicroSecs} = now().
UnixTime = MegaSecs * 1000000 + Secs.

Just using the second entry of the tuple will tell you the time in seconds since the last decimal trillionellium (in seconds since the UNIX epoch).

[2017 Edit] now is deprecated, but erlang:timestamp() is not and returns the same format as now did.

Hollar answered 26/1, 2012 at 10:47 Comment(2)
Note also that now() is guaranteed to yield different results in different threads even though the call is at the exact same time.Tidal
Erlang now has os:system_time(second), which is more convenient than converting the triple returned by erlang:timestamp().Portion
R
3

Which of these 3 parameters is the required number of seconds since Jan 1, 1970 ?

All three of them, collectively. Look at the given timestamp. It's January 7, 1970. Presumably Secs will be between 0 (inclusive) and 1,000,000 (exclusive). One million seconds is only 11.574 days. You need to use the megaseconds as well as the seconds. Since the error tolerance is 600 seconds you can ignore the microseconds part of the response from erlang:now().

Roturier answered 26/1, 2012 at 10:50 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.