Time.time () de Python renvoie-t-il l'horodatage local ou UTC?

562

Est-ce que time.time()dans le module de temps Python renvoie l'heure du système ou l'heure en UTC?

Saransh Mohapatra
la source
87
Les horodatages n'ont pas de fuseau horaire. Ils représentent un certain nombre de secondes depuis l'époque. L'époque est un moment précis dans le temps qui ne dépend pas du fuseau horaire.
jwg
2
@jwg: les horodatages POSIX couramment utilisés ne comptent pas les secondes intercalaires et ne sont donc pas le "nombre de [SI écoulé] secondes depuis l'époque" (ils sont proches).
jfs
7
Je ne pense pas que ce soit une objection précise @JFSebastian. Les secondes intercalaires ne sont pas des «secondes écoulées depuis l'époque». Ce sont des changements dans les représentations temporelles enregistrées par des horloges qui ne correspondent pas aux secondes écoulées.
jwg
4
@JFSebastian Désolé pour la confusion. Les secondes intercalaires ne sont pas des «secondes écoulées». Par conséquent, les horodatages, qui sont des «nombres de secondes écoulées», n'incluent pas et ne doivent pas inclure de secondes intercalaires.
jwg
2
@jwg mal. Vous ne pouvez pas effacer le temps physique. L'horodatage POSIX n'est pas le nombre de secondes SI écoulées. Voici un exemple: 3 secondes se sont écoulées entre le "31 décembre 2016 à 18 h 59 min 59 s" et le "31 décembre 2016 à 19 h 01 min 01" à New York, mais la différence dans les horodatages POSIX correspondants n'est que de 2 secondes (le la seconde intercalaire n'est pas comptée).
jfs

Réponses:

781

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 tsvariable est le temps renvoyé en secondes. Je l'ai ensuite converti en chaîne à l'aide de la datetimebibliothèque, ce qui en fait une chaîne lisible par l'homme.

squiguy
la source
72
Pourquoi devrions-nous import timequand datetime vous donne essentiellement un horodatage. Il suffit de retirer les millisecondes -str(datetime.datetime.now()).split('.')[0]
Hussain
17
L'époque @Alexis Unix est définie assez clairement ici . Il signale même un exemple Python dans la page. Je ne comprends pas votre commentaire.
squiguy
9
@squiguy pour être honnête, je ne me souviens pas de ce qui m'a fait dire ça. J'ai dû mal lire quelque chose, et j'ai eu du mal à trouver pourquoi certains tests se cassaient pendant que je me déplaçais entre la France et les États-Unis pour finalement trouver que le problème était à cause de l'heure d'été qui rend la semaine plus longue à cette période de l'année. Désolé pour cela et merci de l'avoir signalé.
Alexis
5
il ne s'agit pas de "secondes en UTC". . L'horodatage renvoyé par 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).
jfs
3
viens de le tester, time.time () ne donne pas l'heure UTC, il donne mon fuseau horaire local
sliders_alpha
302

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 nowdiffère de utcnowcomme 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
pepr
la source
1
Je voulais l'heure de l'époque ... pas au format de date ... comme en témoigne ma mention de la commande time.time ()
Saransh Mohapatra
34
OK, pas de problème. Quelqu'un d'autre peut avoir besoin d'un horodatage pour placer des fichiers texte.
pepr
1
J'en suis un autre, redirigé ici probablement en raison du nombre déraisonnable de votes positifs. La question est mal formée et la réponse acceptée est trompeuse pour le besoin typique: obtenir un suffixe lisible par l'homme - par exemple pour les noms de fichiers - dans le fuseau horaire du serveur le plus utilisé.
Pour imprimer un horodatage dans le cadre d'une chaîne, utilisez ceci: Python2: import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()Python3:import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
Mr-IDE
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.
Terrel Shumway
139

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.

Rudi Strydom
la source
1
Quelle est la raison de la transtypage de l'horodatage? Quel est le type par défaut?
Tizzee
3
@Tizzee type(time.time())donne<type 'float'>
célèbregarkin le
4
Mais si vous avez besoin d'un temps plus précis qu'en secondes, le flotteur a du sens.
2014
3
@RudiStrydom: Python est fortement typé. Ne le confondez pas avec une saisie statique.
jfs
1
@CheokYanCheng: int()est polymorphe. Il reviendrait longsi nécessaire sur les anciennes versions de Python - tous les entiers sont longs sur les nouvelles versions de Python.
jfs
30

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?

jfs
la source
4
Ceci est la seule réponse qui mentionne correctement datetime.utcfromtimestampalors qu'il y a 308 votes positifs sur une réponse avec datetime.fromtimestamp:-(
@TerrelShumway la question est de savoir ce que 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).
jfs
Ne pas utiliser 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.
Terrel Shumway
Oui. Mon commentaire précédent était complètement faux. La plupart du code du module datetime traite les datetimes naïfs comme l'heure locale. Utiliser des datatives naïves, c'est comme ouvrir un fichier texte sans connaître l'encodage.
Terrel Shumway
@TerrelShumway Il est faux de supposer que l'heure UTC ne peut être utilisée que sur des systèmes où il s'agit de l'heure locale. Il est vrai que certaines parties de stdlib traitent les objets naïfs datetime comme ayant le fuseau horaire local (malheureusement). Je préférerais que 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.
jfs
4

Je me suis finalement contenté de:

>>> import time
>>> time.mktime(time.gmtime())
1509467455.0
Natim
la source
1
Cela peut satisfaire vos besoins locaux, mais cela peut être trompeur pour les personnes qui s'attendent à ce que les nombres dans cette plage soient en secondes depuis l'époque [GMT]. time.time()renvoie décimal / flottant comme 1574115250.818733et millisecondes-puisque-epoch est facilement int(time.time() * 1000)par exemple1574115254915
MarkHu
3

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.

HyperNeutrino
la source
S'il est vrai que l'UTC est un standard horaire et non un fuseau horaire, le standard est qu'il partage le même temps que GMT. Alors ....
Craig Hicks
3

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 arrowavec 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]>
Ryabchenko Alexander
la source