Est-ce que time.time()
dans le module de temps Python renvoie l'heure du système ou l'heure en UTC?
Est-ce que time.time()
dans le module de temps Python renvoie l'heure du système ou l'heure en UTC?
Réponses:
La time.time()
fonction renvoie le nombre de secondes depuis l'époque, en secondes. Notez que l '"époque" est définie comme le début du 1er janvier 1970 à UTC. L'époque est donc définie en termes d'UTC et établit un moment global dans le temps. Peu importe où vous êtes "secondes après l'époque" (time.time ()) renvoie la même valeur au même moment.
Voici quelques exemples de sortie que j'ai exécutés sur mon ordinateur, en les convertissant également en chaîne.
Python 2.7.3 (default, Apr 24 2012, 00:00:54)
[GCC 4.7.0 20120414 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> ts = time.time()
>>> print ts
1355563265.81
>>> import datetime
>>> st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
>>> print st
2012-12-15 01:21:05
>>>
La ts
variable est le temps renvoyé en secondes. Je l'ai ensuite converti en chaîne à l'aide de la datetime
bibliothèque, ce qui en fait une chaîne lisible par l'homme.
import time
quand datetime vous donne essentiellement un horodatage. Il suffit de retirer les millisecondes -str(datetime.datetime.now()).split('.')[0]
time.time()
n'est dans aucun fuseau horaire . "secondes depuis l'époque" est un terme; il ne s'est pas écoulé en secondes depuis un certain point dans le temps (époque). Vous pouvez le convertir à votre heure locale (avec la base de données tz) et / ou au fuseau horaire UTC facilement. btw, si vous laissez tomber .strftime()
le résultat est (presque) le même (+/- microsecondes).
Il s'agit de la forme texte d'un horodatage qui peut être utilisé dans vos fichiers texte. (Le titre de la question était différent dans le passé, donc l'introduction de cette réponse a été modifiée pour clarifier comment elle pouvait être interprétée comme l'heure. [Mis à jour le 2016-01-14])
Vous pouvez obtenir l'horodatage sous forme de chaîne à l'aide de .now()
ou .utcnow()
de datetime.datetime
:
>>> import datetime
>>> print datetime.datetime.utcnow()
2012-12-15 10:14:51.898000
Le now
diffère de utcnow
comme prévu - sinon ils fonctionnent de la même manière:
>>> print datetime.datetime.now()
2012-12-15 11:15:09.205000
Vous pouvez rendre l’horodatage de la chaîne explicitement:
>>> str(datetime.datetime.now())
'2012-12-15 11:15:24.984000'
Ou vous pouvez être encore plus explicite pour formater l'horodatage comme vous le souhaitez:
>>> datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M%p")
'Saturday, 15. December 2012 11:19AM'
Si vous souhaitez le format ISO, utilisez la .isoformat()
méthode de l'objet:
>>> datetime.datetime.now().isoformat()
'2013-11-18T08:18:31.809000'
Vous pouvez les utiliser dans des variables pour les calculs et l'impression sans conversions.
>>> ts = datetime.datetime.now()
>>> tf = datetime.datetime.now()
>>> te = tf - ts
>>> print ts
2015-04-21 12:02:19.209915
>>> print tf
2015-04-21 12:02:30.449895
>>> print te
0:00:11.239980
import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()
Python3:import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
datetime.datetime.utcnow()
est mauvais. Il crée un datetime naïf qui n'est pas l'heure locale. À moins que votre heure locale ne soit UTC, elle sera incorrecte. Utilisez datetime.datetime.now(datetime.timezone.utc)
plutôt. Cela crée un datetime sensible au fuseau horaire représentant l'heure actuelle.
Sur la base de la réponse de #squiguy, pour obtenir un véritable horodatage, je le tape cast from float.
>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318
C'est du moins le concept.
type(time.time())
donne<type 'float'>
int()
est polymorphe. Il reviendrait long
si nécessaire sur les anciennes versions de Python - tous les entiers sont longs sur les nouvelles versions de Python.
La réponse pourrait être ni l'un ni l'autre, ni les deux.
ni: time.time()
renvoie approximativement le nombre de secondes écoulées depuis l'Époque. Le résultat ne dépend pas du fuseau horaire, il n'est donc ni UTC ni heure locale. Voici la définition POSIX pour "Seconds Since the Epoch" .
both: time.time()
n'exige pas que l'horloge de votre système soit synchronisée, donc elle reflète sa valeur (bien qu'elle n'ait rien à voir avec le fuseau horaire local). Différents ordinateurs peuvent obtenir des résultats différents en même temps. D'un autre côté, si l'heure de votre ordinateur est synchronisée, il est facile d'obtenir l'heure UTC à partir de l'horodatage (si nous ignorons les secondes intercalaires):
from datetime import datetime
utc_dt = datetime.utcfromtimestamp(timestamp)
Sur la façon d'obtenir des horodatages à partir de l'heure UTC dans différentes versions de Python, voir Comment puis-je obtenir une date convertie en secondes depuis l'époque selon UTC?
datetime.utcfromtimestamp
alors qu'il y a 308 votes positifs sur une réponse avec datetime.fromtimestamp
:-(
time.time()
renvoie la fonction (elle est très courte). Votre commentaire répond à une autre question (vous avez changé votre commentaire depuis que j'ai commencé à y répondre. Pour le pire). Une note de côté; le mot «correct» doit être utilisé avec parcimonie (les fuseaux horaires sont compliqués - il n'y a pas de solution miracle - uniquement des compromis pour un cas d'utilisation particulier).
datetime.datetime.utcfromtimestamp(ts)
. Sauf si votre heure locale est UTC, elle sera incorrecte, car elle crée une date / heure naïve qui n'est pas l'heure locale. Utilisez datetime.datetime.fromtimestamp(ts,datetime.timezone.utc)
plutôt. Cela crée un datetime sensible au fuseau horaire représentant le même instant que l'horodatage.
naive_dt.astimezone()
cela n'existe pas car implicite bytes.encode()
n'existe plus dans Python 3. Il est vrai qu'il est avantageux de travailler avec le temps UTC en interne dans de nombreux cas. Il y a beaucoup de choses à dire sur le module datetime (j'ai répondu à suffisamment de questions pour obtenir un badge en or), la plupart sont hors de portée pour la question: ce qui time.time()
revient.
Je me suis finalement contenté de:
>>> import time
>>> time.mktime(time.gmtime())
1509467455.0
time.time()
renvoie décimal / flottant comme 1574115250.818733
et millisecondes-puisque-epoch est facilement int(time.time() * 1000)
par exemple1574115254915
Il n'y a pas de "époque" dans un fuseau horaire spécifique. L'époque est bien définie comme un moment précis dans le temps, donc si vous changez le fuseau horaire, l'heure elle-même change également. Plus précisément, cette fois est Jan 1 1970 00:00:00 UTC
. Renvoie donc time.time()
le nombre de secondes écoulées depuis l'époque.
L'horodatage est toujours l'heure en utc, mais lorsque vous l'appelez, datetime.datetime.fromtimestamp
il renvoie l'heure dans votre fuseau horaire local correspondant à cet horodatage, donc le résultat dépend de votre locale.
>>> import time, datetime
>>> time.time()
1564494136.0434234
>>> datetime.datetime.now()
datetime.datetime(2019, 7, 30, 16, 42, 3, 899179)
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2019, 7, 30, 16, 43, 12, 4610)
Il existe une belle bibliothèque arrow
avec un comportement différent. Dans le même cas, il vous renvoie l'objet temporel avec le fuseau horaire UTC.
>>> import arrow
>>> arrow.now()
<Arrow [2019-07-30T16:43:27.868760+03:00]>
>>> arrow.get(time.time())
<Arrow [2019-07-30T13:43:56.565342+00:00]>