2012-01-26 12 views
2

リモートサーバーと対話しています。このリモートサーバーは異なるタイムゾーンにあります。 erlang:now()1970年1月1日からの秒数00:00:00 GMT Erlang

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

calendar:universal_time() ?のようにUPDATE

としなければならないものがある、私はこれを使用することにより、時間期限切れの問題をオフにする管理:
 
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. 
しかし、疑問が残ります。これを得るための方法、アーランの基本的な方法、おそらくBIF、そうでしょうか?

答えて

6

あなたはこのように、now()の結果から(1970年からの秒)UNIX時間を計算する必要があります。

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

ただ、タプルの2番目のエントリを使用すると、あなたの最後以来の秒単位の時間を教えてくれます小数点の兆(UNIXの時代からの秒単位)。

[2017編集] nowは推奨されるが、erlang:timestamp()はなく、nowが行ったのと同じ形式を返します。

+0

ありがとうございました –

+2

今では、呼び出しがまったく同じ時間であっても、now()は異なるスレッドで異なる結果をもたらすことが保証されています。 –

+0

私はこの回答を今日有効に編集しました。 – Tommy

3

これら3つのパラメータのうち、1970年1月1日以降に必要な秒数はどれですか?

全部で3つ。与えられたタイムスタンプを見てください。おそらくSecsは0以上100万以下の間になります。 100万秒はわずか11.574日です。メガ秒と秒を使用する必要があります。エラー許容値は600秒なので、応答のマイクロ秒部分は、erlang:now()から無視できます。

+0

ありがとう –

関連する問題