2012-01-26 2 views
2

J'interagis avec un serveur distant. Ce serveur distant est dans un fuseau horaire différent. Une partie de l'authentification me oblige à produire le:Nombre de secondes depuis le 1er janvier 1970 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" 

La documentation de erlang:now(). révèle qu'il peut me procurer le the elapsed time since 00:00 GMT, January 1, 1970 (zero hour) on the assumption that the underlying OS supports this. Il renvoie un tuple size=3, {MegaSecs, Secs, MicroSecs}. J'ai essayé d'utiliser element(2,erlang:now()) mais le serveur distant m'envoie ce message:

 
Timestamp expired: Given timestamp (1970-01-07T14:44:42Z) 
not within 600s of server time (2012-01-26T09:51:26Z) 
Lequel de ces 3 paramètres est le nombre de secondes requis depuis le 1er janvier 1970? Qu'est-ce que je ne fais pas bien? Y at-il quelque chose que je dois faire avec le universal time comme dans calendar:universal_time() ?

MISE À JOUR
Comme une mise à jour, j'ai réussi à éteindre le problème de temps expiré en utilisant ceci:
 
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. 
Cependant, la question reste encore. Il doit y avoir un moyen, une façon fondamentale d'obtenir Erlang, probablement un BIF, non?

Répondre

6

Vous devez calculer le temps UNIX (secondes depuis 1970) à partir des résultats de now(), comme ceci:

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

Tout en utilisant la deuxième entrée du tuple vous dira le temps en secondes depuis la dernière trillionellium décimal (en secondes depuis l'époque UNIX).

[2017 Modifier] now est dépréciée, mais erlang:timestamp() n'est pas et retourne le même format que now fait.

+0

Merci beaucoup –

+2

Notez également que maintenant() est garanti pour donner des résultats différents dans différents threads même si l'appel est à la même heure. –

+0

J'ai modifié cette réponse pour être valide aujourd'hui. – Tommy

3

Lequel de ces 3 paramètres est le nombre de secondes requis depuis le 1er janvier 1970?

Tous les trois, collectivement. Regardez l'horodatage donné. C'est le 7 janvier 1970. Vraisemblablement Secs sera compris entre 0 (inclusivement) et 1 000 000 (exclusif). Un million de secondes est seulement 11.574 jours. Vous devez utiliser les mégasecondes ainsi que les secondes. Puisque la tolérance d'erreur est de 600 secondes, vous pouvez ignorer la partie en microsecondes de la réponse de erlang:now().

+0

Merci beaucoup –

Questions connexes