自1970年1月1日00:00:00 GMT Erlang以来的秒数

时间:2012-01-26 10:39:02

标签: unix erlang timezone mnesia

我正在与远程服务器进行交互。此远程服务器位于不同的时区。部分身份验证要求我生成:

"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"

erlang:now()的文档。揭示它可以让我the elapsed time since 00:00 GMT, January 1, 1970 (zero hour) on the assumption that the underlying OS supports this。它返回size=3元组{MegaSecs, Secs, MicroSecs}。我尝试使用element(2,erlang:now()),但远程服务器向我发送以下消息:

Timestamp expired: Given timestamp (1970-01-07T14:44:42Z)
not within 600s of server time (2012-01-26T09:51:26Z)
这三个参数中的哪一个是自1970年1月1日以来所需的秒数?我做的不对吗?我是否有universal timecalendar:universal_time() ? 更新有关的事项作为更新,我设法通过使用以下方法关闭过期问题:
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.
但问题仍然存在。必须有一种方法,一种基本的Erlang方式来获得这个,可能是BIF,对吗?

2 个答案:

答案 0 :(得分:6)

您必须从now()的结果计算UNIX时间(自1970年以来的秒数),如下所示:

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

只需使用元组的第二个条目就会告诉你自上一个十进制trillionellium以来的秒数(自UNIX纪元以来的秒数)。

[2017年编辑] 不推荐使用now,但erlang:timestamp()不是,并返回与now相同的格式。

答案 1 :(得分:3)

  

这三个参数中的哪一个是自1970年1月1日以来所需的秒数?

所有这三个人,统称。查看给定的时间戳。它是1970年1月7日。据推测,Secs将在0(包括)和1,000,000(不包括)之间。一百万秒只有11.574天。您需要使用megaseconds和秒。由于误差容限为600秒,您可以忽略来自erlang:now()的响应的微秒部分。