【问题标题】:Number of seconds since January 1, 1970 00:00:00 GMT Erlang自 1970 年 1 月 1 日 00:00:00 GMT Erlang 以来的秒数
【发布时间】:2012-02-19 11:22:52
【问题描述】:

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

"自 1970 年 1 月 1 日 00:00:00 GMT 以来的秒数 服务器将只接受时间戳为 在当前时间的 600 秒内"

@987654321@ 的文档。显示它可以让我得到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()),但远程服务器向我发送了这条消息:

时间戳过期:给定时间戳 (1970-01-07T14:44:42Z) 不在服务器时间的 600 秒内 (2012-01-26T09:51:26Z) 这三个参数中的哪一个是自 1970 年 1 月 1 日以来所需的秒数?我做错了什么?与calendar:universal_time() ? 中的universal time 有什么关系吗

更新
作为更新,我设法关闭了时间-使用这个过期问题:
seconds_1970()->
    T1 = {{1970,1,1},{0,0,0}},
    T2 = 日历:universal_time(),
    {天,{HH,Mins,Secs}} = 日历:time_difference(T1,T2),
    (天 * 24 * 60 * 60) + (HH * 60 * 60) + (分钟 * 60) + 秒。
然而,问题仍然存在。必须有一种方法,一种基本的 Erlang 方法,可能是 BIF,对吧?

【问题讨论】:

    标签: unix erlang timezone mnesia


    【解决方案1】:

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

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

    仅使用元组的第二个条目将告诉您自最后一个十进制万亿元以来的秒数(自 UNIX 纪元以来的秒数)。

    [2017 年编辑] now 已弃用,但 erlang:timestamp() 已弃用,并返回与 now 相同的格式。

    【讨论】:

    • 还要注意 now() 保证在不同的线程中产生不同的结果,即使调用是在完全相同的时间。
    • Erlang 现在有了os:system_time(second),这比转换erlang:timestamp() 返回的三元组更方便。
    【解决方案2】:

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

    他们三个,集体。查看给定的时间戳。现在是 1970 年 1 月 7 日。大概Secs 将介于 0(含)和 1,000,000(不含)之间。一百万秒只有 11.574 天。您需要使用兆秒和秒。由于容错为 600 秒,您可以忽略来自erlang:now() 的响应的微秒部分。

    【讨论】:

      猜你喜欢
      • 2016-12-27
      • 2013-05-31
      • 2017-06-21
      • 1970-01-01
      • 2023-01-13
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      相关资源
      最近更新 更多