Si vous avez atterri ici juste en voulant des secondes d'époque actuelles avec une précision en millisecondes, essayez $ python -c 'import time; print(time.time())'ce qui a donné:1584487455.698623
MarkHu
Réponses:
474
Il me semble que la façon la plus simple de le faire est
Jusqu'à présent, c'est la meilleure solution (si version python> 2.7). Parce que l'implémentation de %sdépend du système d'exploitation! Ainsi, n'importe qui veut que le code fonctionne de manière fiable quel que soit le système d'exploitation, ne doit JAMAIS utiliser %s. Pour 2,3 <py ver <2,7. On peut simplement en construire un total_seconds()comme ça:delta.days*86400+delta.seconds+delta.microseconds/1e6
Il convient de mentionner que si tout ce que vous voulez est un véritable horodatage Unix tel que défini ici en.wikipedia.org/wiki/Unix_time (et que vous n'utiliserez donc que la fonction unix_time de cette réponse), vous devez encapsuler delta.total_seconds () avec int pour éviter de se retrouver avec un flotteur
corford
1
L'époque calculée à l'aide de utcfromtimestamp(0)peut provoquer un décalage de «tz» uniquement si «tz» n'est pas égal à 0. Cela est dû dt au fait que dans dt- epoch«tz» y est calculé alors que epoch est le temps UTC. La meilleure façon de calculer l'époque epoch = datetime.datetime(1970, 1, 1)est de considérer le fuseau horaire.
ahj
35
Pourquoi oh pourquoi datetime.utcfromtimestamp(0)retourne un datetime sans tzinfo? C'est juste là dans le nom de la méthode, utc fromtimestamp. Afin de le rendre non naïf, je dois faire quelque chose comme datetime.utcfromtimestamp(0).replace(tzinfo=pytz.UTC). Cela est nécessaire si le dtfuseau horaire est au courant, sinon vous obtiendrezTypeError: can't subtract offset-naive and offset-aware datetimes
FGreg
171
En Python 3.3, ajout d'une nouvelle méthode timestamp:
Si vous utilisez timestampun objet datetime naïf, il a supposé qu'il se trouve dans le fuseau horaire local. Utilisez des objets datetime compatibles avec le fuseau horaire si ce n'est pas ce que vous avez l'intention de faire.
Remarque: la .timestamp()méthode suppose qu'un datetime d'entrée naïf se trouve dans le fuseau horaire local (et que l'heure locale peut être ambiguë). S'il est en UTC, utilisez-le à la dt.replace(tzinfo=timezone.utc).timestamp()place .
jfs
11
datetime.timestamp () renvoie les secondes de l'époque sous forme de flottant. Pour obtenir des millisecondes: int (datetime.timestamp () * 1000)
Solar.gy
9
Cette réponse n'est pas un exemple copiable et collable, dans l'esprit des documents peu conviviaux sur docs.python.org/3/library/… - c'est: datetime.datetime.timestamp(datetime.datetime.now())
MarkHu
3
Dans 3.6 (au moins), datetime.timestamp () suppose qu'un datetime naïf (tzinfo = None) datetime est en UTC. Il vaut donc toujours mieux que votre fuseau horaire soit défini: datetime.datetime.now(pytz.timezone('Europe/Paris')).timestamp() == datetime.datetime.now(pytz.utc).timestamp() == datetime.datetime.utcnow().timestamp()mais pas (toujours) égal à datetime.datetime.now().timestamp()(ce dernier n'est égal au reste que si le tz local est UTC ...)
>>>import datetime
>>># replace datetime.datetime.now() with your datetime object>>> int(datetime.datetime.now().strftime("%s"))*10001312908481000
Ou l'aide du module de temps (et sans formatage de date):
>>>import datetime, time
>>># replace datetime.datetime.now() with your datetime object>>> time.mktime(datetime.datetime.now().timetuple())*10001312908681000.0
Btw, strftime ("% s") renvoie une chaîne vide pour moi. La deuxième façon fonctionne bien.
Pavel Vlasov
23
N'a
6
'% s' n'est pas pris en charge par Python, par exemple, il peut être absent sous Windows. .timetuple()renvoie tm_isdst=-1il force mktime()à deviner. Il peut deviner à tort pendant l'heure d'été (50% de risque d'erreur +/- heure). '% S' et mktime()peuvent utiliser le mauvais décalage utc pour les dates du passé. Vous avez besoin d'une base de données de fuseau horaire historique telle que fournie par le pytzmodule pour convertir de manière fiable l'heure locale en horodatage POSIX (sauf si le système d'exploitation fournit déjà une telle base de données)
jfs
1
time.mktime(ts.timetuple())où ts est l'objet datetime de python
suhailvs
1
@suhail: lisez mon commentaire ci-dessus à propos de mktime/timetuple. timetuple()Dépouille également des fractions de seconde et le but de la question est d'obtenir l'horodatage avec une précision en millisecondes.
jfs
15
Vous pouvez utiliser Delorean pour voyager dans l'espace et le temps!
@JFSebastian Merci pour l'avertissement! en effet, aucun dst n'est envisagé. Si votre serveur est en heure locale au lieu de UTC, cela fera une différence. Je n'ai pas (encore) trouvé de raison impérieuse de configurer des serveurs dans autre chose que UTC. Ma devise est "écrire UTC, lire l'heure locale" afin que vous sachiez toujours où vous séjournez ...
estani
2
Vous pouvez toujours utiliser calendar.timegm au lieu de mktime pour éviter le problème de mktime essayant de deviner le fuseau horaire.
@ChristopherBull Divisez simplement le nombre de millisecondes par 1000 pour arriver en secondes
Jonas
5
Vous avez mal compris et vous vous êtes trompé. Les secondes sont toutes prêtes à être disponibles dans les fonctions ci-dessus. Vous pouvez le convertir en millisecondes, mais ce serait la précision d'une seconde.
Christopher Bull
1
Cette réponse utilise le timemodule, mais l'OP a posé des questions sur le datetimemodule. FWIW, l'époque actuelle la plus simple estint(time.time())
MarkHu
7
from datetime import datetime
from calendar import timegm
# Note: if you pass in a naive dttm object it's assumed to already be in UTCdef unix_time(dttm=None):if dttm isNone:
dttm = datetime.utcnow()return timegm(dttm.utctimetuple())print"Unix time now: %d"% unix_time()print"Unix timestamp from an existing dttm: %d"% unix_time(datetime(2014,12,30,12,0))
timegm()ne fonctionne qu'avec le temps utc. Il n'utilise pas tm_isdstdonc vous pouvez utiliser à la utcnow.timetuple()place de utcnow.utctimetuple(). Remarque: l'utilisation naive_local_datetime.utctimetuple()serait incorrecte ici. Il ne traduit pas l'heure locale en utc. timetuple()Appelez également les fractions de fractions de seconde du résultat (si cela dépend de l'application). De plus, la question porte sur * milli * secondes, pas sur les secondes
jfs
Je préfère utiliser utcnow () et utctimetuple () pour rendre le code absolument clair que vous traitez avec UTC (et de cette façon, quiconque le lisant n'a pas à se rappeler que timegm est uniquement UTC). utctimetuple () n'implique pas de traduction sur un objet dttm naïf (d'où l'initiation du dttm avec utcnow ()). En outre, la question mentionne des secondes ou des millisecondes.
corford
Remarque: j'aurais dû dire dans le dernier commentaire que j'ai lu la question comme impliquant qu'il voulait des secondes ou des millisecondes (probablement mon erreur). Pour les millis, multipliez simplement par 1000 (comme le suggère la réponse du meilleur score).
corford
utctimetuple()dépouille des fractions de seconde. La multiplication par 1000ne les récupérera pas.
jfs
1
En raison de la façon dont l'OP a posé cette question, on ne sait pas exactement ce qu'il / elle voulait (c'est-à-dire un horodatage Unix vrai ou un horodatage avec une précision en millisecondes). Quoi qu'il en soit, les deux questions ont déjà été posées et répondues ailleurs. Cela dit, je pense que les réponses ici sont les plus rapides et les plus propres à saisir et à illustrer les différentes solutions au problème.
corford
3
>>>import datetime
>>>import time
>>>import calendar
>>>#your datetime object>>> now = datetime.datetime.now()>>> now
datetime.datetime(2013,3,19,13,0,9,351812)>>>#use datetime module's timetuple method to get a `time.struct_time` object.[1]>>> tt = datetime.datetime.timetuple(now)>>> tt
time.struct_time(tm_year=2013, tm_mon=3, tm_mday=19, tm_hour=13, tm_min=0, tm_sec=9, tm_wday=1, tm_yday=78, tm_isdst=-1)>>>#If your datetime object is in utc you do this way. [2](see the first table on docs)>>> sec_epoch_utc = calendar.timegm(tt)*1000>>> sec_epoch_utc
1363698009>>>#If your datetime object is in local timeformat you do this way>>> sec_epoch_loc = time.mktime(tt)*1000>>> sec_epoch_loc
1363678209.0
C'est faux! L'horaire ne comprend pas la milliseconde, donc mktime ne renverra pas l'époque avec une résolution en millisecondes. C'est inutile dans ce cas.
Wang
@Wang - vous avez raison monsieur, cela ne retourne pas millis, seulement quelques secondes
Si vous supprimez * 1000, cependant, vous obtenez seconds_since_epoch. Vote pour cette réponse parce que je ne me soucie pas des millisecondes en ce moment.
Michael Scheper
0
Voici une fonction que j'ai faite sur la base de la réponse ci-dessus
def getDateToEpoch(myDateTime):
res =(datetime.datetime(myDateTime.year,myDateTime.month,myDateTime.day,myDateTime.hour,myDateTime.minute,myDateTime.second)- datetime.datetime(1970,1,1)).total_seconds()return res
Vous pouvez encapsuler la valeur retournée comme ceci: str (int (res)) Pour la retourner sans valeur décimale à utiliser comme chaîne ou juste int (sans la chaîne)
$ python -c 'import time; print(time.time())'
ce qui a donné:1584487455.698623
Réponses:
Il me semble que la façon la plus simple de le faire est
la source
%s
dépend du système d'exploitation! Ainsi, n'importe qui veut que le code fonctionne de manière fiable quel que soit le système d'exploitation, ne doit JAMAIS utiliser%s
. Pour 2,3 <py ver <2,7. On peut simplement en construire untotal_seconds()
comme ça:delta.days*86400+delta.seconds+delta.microseconds/1e6
dt
doit être en UTC (pas local). Voir une réponse similaire avec le support Python 2.6 / 3utcfromtimestamp(0)
peut provoquer un décalage de «tz» uniquement si «tz» n'est pas égal à 0. Cela est dûdt
au fait que dansdt- epoch
«tz» y est calculé alors que epoch est le temps UTC. La meilleure façon de calculer l'époqueepoch = datetime.datetime(1970, 1, 1)
est de considérer le fuseau horaire.datetime.utcfromtimestamp(0)
retourne un datetime sans tzinfo? C'est juste là dans le nom de la méthode, utc fromtimestamp. Afin de le rendre non naïf, je dois faire quelque chose commedatetime.utcfromtimestamp(0).replace(tzinfo=pytz.UTC)
. Cela est nécessaire si ledt
fuseau horaire est au courant, sinon vous obtiendrezTypeError: can't subtract offset-naive and offset-aware datetimes
En Python 3.3, ajout d'une nouvelle méthode
timestamp
:Votre question indiquait que vous aviez besoin de millisecondes, que vous pouvez obtenir comme ceci:
Si vous utilisez
timestamp
un objet datetime naïf, il a supposé qu'il se trouve dans le fuseau horaire local. Utilisez des objets datetime compatibles avec le fuseau horaire si ce n'est pas ce que vous avez l'intention de faire.la source
.timestamp()
méthode suppose qu'un datetime d'entrée naïf se trouve dans le fuseau horaire local (et que l'heure locale peut être ambiguë). S'il est en UTC, utilisez-le à ladt.replace(tzinfo=timezone.utc).timestamp()
place .datetime.datetime.timestamp(datetime.datetime.now())
datetime.datetime.now(pytz.timezone('Europe/Paris')).timestamp() == datetime.datetime.now(pytz.utc).timestamp() == datetime.datetime.utcnow().timestamp()
mais pas (toujours) égal àdatetime.datetime.now().timestamp()
(ce dernier n'est égal au reste que si le tz local est UTC ...)fromtimestamp
( docs.python.org/3/library/… )Ou l'aide du module de temps (et sans formatage de date):
Répondu avec l'aide de: http://pleac.sourceforge.net/pleac_python/datesandtimes.html
Documentation:
time.mktime
datetime.timetuple
la source
.timetuple()
renvoietm_isdst=-1
il forcemktime()
à deviner. Il peut deviner à tort pendant l'heure d'été (50% de risque d'erreur +/- heure). '% S' etmktime()
peuvent utiliser le mauvais décalage utc pour les dates du passé. Vous avez besoin d'une base de données de fuseau horaire historique telle que fournie par lepytz
module pour convertir de manière fiable l'heure locale en horodatage POSIX (sauf si le système d'exploitation fournit déjà une telle base de données)time.mktime(ts.timetuple())
où ts est l'objet datetime de pythonmktime/timetuple
.timetuple()
Dépouille également des fractions de seconde et le but de la question est d'obtenir l'horodatage avec une précision en millisecondes.Vous pouvez utiliser Delorean pour voyager dans l'espace et le temps!
http://delorean.readthedocs.org/en/latest/quickstart.html
la source
Voici comment je le fais:
la source
Recommandations de la documentation Python 2.7 pour le
time
modulela source
time
module, mais l'OP a posé des questions sur ledatetime
module. FWIW, l'époque actuelle la plus simple estint(time.time())
la source
timegm()
ne fonctionne qu'avec le temps utc. Il n'utilise pastm_isdst
donc vous pouvez utiliser à lautcnow.timetuple()
place deutcnow.utctimetuple()
. Remarque: l'utilisationnaive_local_datetime.utctimetuple()
serait incorrecte ici. Il ne traduit pas l'heure locale en utc.timetuple()
Appelez également les fractions de fractions de seconde du résultat (si cela dépend de l'application). De plus, la question porte sur * milli * secondes, pas sur les secondesutctimetuple()
dépouille des fractions de seconde. La multiplication par1000
ne les récupérera pas.[1] http://docs.python.org/2/library/datetime.html#datetime.date.timetuple
[2] http://docs.python.org/2/library/time.html
la source
Voici une autre forme de solution avec normalisation de votre objet temps:
la source
Un peu de code pandas:
la source
la source
* 1000
, cependant, vous obtenezseconds_since_epoch
. Vote pour cette réponse parce que je ne me soucie pas des millisecondes en ce moment.Voici une fonction que j'ai faite sur la base de la réponse ci-dessus
Vous pouvez encapsuler la valeur retournée comme ceci: str (int (res)) Pour la retourner sans valeur décimale à utiliser comme chaîne ou juste int (sans la chaîne)
la source
Cette autre solution pour datetime caché à unixtimestampmillis.
la source