@Hasteur, oui. Le deuxième nombre représente le nombre de secondes qui se sont écoulées entre le début de l'époque unix et la date spécifiée. Ce format est également appelé heure POSIX.
eikonomega
Réponses:
316
>>>import time
>>>import datetime
>>> s ="01/12/2011">>> time.mktime(datetime.datetime.strptime(s,"%d/%m/%Y").timetuple())1322697600.0
il suppose minuit 01/12/2011 dans le fuseau horaire local. Si l'entrée est en UTC; vous pouvez utiliser calendar.timegm()ou.toordinal()
jfs
49
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()est un peu plus court
timdiels
11
@timdiels: encore une fois. .timestamp()suppose l' heure locale au lieu de l'UTC si aucun fuseau horaire explicite n'est donné. Le code dans la réponse ne fonctionne (produit attendu 1322697600) que sur un ordinateur où le fuseau horaire local n'a aucun décalage utc.
jfs
7
cela ne fonctionne pas: datetime.datetime.strptime ("2014: 06: 28 11:53:21", "% Y:% m:% d% H:% M:% S"). timestamp () Traceback ( dernier appel le plus récent): Fichier "<stdin>", ligne 1, dans <module> AttributeError: l'objet 'datetime.datetime' n'a pas d'attribut 'timestamp'
Quand je lance les exemples dans ce post, je reçois l'erreur: NameError: name 'wckCalendar' is not defined. J'exécute Python 3.4.1 sur une machine Windows 32 bits. Une idée? Merci.
sedeh
1
@sedeh il n'y a pas de wckCalendar dans le post. Vérifiez votre code.
jfs
@JFSebastian Exactement, et je n'essayais pas d'appeler directement wckCalendar. Il apparaît simplement dans le message d'erreur. Voir mon article ici discutant du problème.
sedeh
1
@ törzsmókus: Si la réponse est fausse, peu importe à quel point elle est lisible.
jfs
1
@ törzsmókus: regardez ma réponse: elle peut produire deux nombres différents. Votre réponse produit un numéro sans mentionner lequel.
La lisibilité compte. Voir ma réponse avec dateutil pour une solution beaucoup plus lisible par l'homme.
törzsmókus
21
La réponse dépend également de votre fuseau horaire de date d'entrée. Si votre date est une date locale, vous pouvez utiliser mktime () comme l'a dit katrielalex - seulement je ne vois pas pourquoi il a utilisé datetime au lieu de cette version plus courte:
Mais observez que mon résultat est différent du sien, car je suis probablement dans un TZ différent (et le résultat est un horodatage UNIX sans fuseau horaire)
Maintenant, si la date d'entrée est déjà en UTC, je pense que la bonne solution est:
Beaucoup de ces réponses ne prennent pas la peine de considérer que la date est naïve pour commencer
Pour être correct, vous devez d'abord faire de la date naïve une date / heure sensible au fuseau horaire
import datetime
import pytz
# naive datetime
d = datetime.datetime.strptime('01/12/2011','%d/%m/%Y')>>> datetime.datetime(2011,12,1,0,0)# add proper timezone
pst = pytz.timezone('America/Los_Angeles')
d = pst.localize(d)>>> datetime.datetime(2011,12,1,0,0,
tzinfo=<DstTzInfo'America/Los_Angeles' PST-1 day,16:00:00 STD>)# convert to UTC timezone
utc = pytz.UTC
d = d.astimezone(utc)>>> datetime.datetime(2011,12,1,8,0, tzinfo=<UTC>)# epoch is the beginning of time in the UTC timestamp world
epoch = datetime.datetime(1970,1,1,0,0,0,tzinfo=pytz.UTC)>>> datetime.datetime(1970,1,1,0,0, tzinfo=<UTC>)# get the total second difference
ts =(d - epoch).total_seconds()>>>1322726400.0
# Don't do this:
d = datetime.datetime(2011,12,1,0,0,0, tzinfo=pytz.timezone('America/Los_Angeles'))>>> datetime.datetime(2011,1,12,0,0,
tzinfo=<DstTzInfo'America/Los_Angeles' LMT-1 day,16:07:00 STD>)# tzinfo in not PST but LMT here, with a 7min offset !!!# when converting to UTC:
d = d.astimezone(pytz.UTC)>>> datetime.datetime(2011,1,12,7,53, tzinfo=<UTC>)# you end up with an offset
Il est faux. OP attend l'heure en "%d/%m/%Y"format. Comparer: dateutil.parser.parse("01/02/2001")etdatetime.strptime("01/02/2001", "%d/%m/%Y")
jfs
merci @jfs, bonne capture. J'ai mis à jour ma réponse en conséquence. (en tant que non-américain, je n'aurais pas pensé que le format illogique M / D / Y était la valeur par défaut pour l'analyseur.)
törzsmókus
1
il ne produit pas l'attendu 1322697600sauf si votre fuseau horaire local est UTC. Voir mon commentaire de 2014
jfs
4
Semble assez efficace:
import datetime
day, month, year ='01/12/2011'.split('/')
datetime.datetime(int(year), int(month), int(day)).timestamp()
1,61 µs ± 120 ns par boucle (moyenne ± écart type de 7 pistes, 100000 boucles chacune)
Quelle est la datetimefonction? datetimede la datetimebibliothèque ne prend pas en charge.timestamp()
Joooeey
@Joooeey: Oui , sur Python 3.3 ou version ultérieure . N'était pas disponible lorsque la question a été publiée, mais elle est disponible depuis septembre 2012.
ShadowRanger
0
utilisez simplement datetime.timestamp (votre instance de datetime), l'instance de datetime contient les informations de fuseau horaire, donc l'horodatage sera un horodatage utc standard. si vous transformez le datetime en horaire, il perdra son fuseau horaire, donc le résultat sera une erreur. si vous voulez fournir une interface, vous devez écrire comme ceci: int (datetime.timestamp (time_instance)) * 1000
Vous pouvez vous référer à ce lien suivant pour utiliser la strptimefonction de datetime.datetime, pour convertir la date de n'importe quel format avec le fuseau horaire.
my_date ='2020/08/08'
my_date = my_date.replace('/','-')# just to adapte to your question
date_timestamp = datetime.datetime.fromisoformat(my_date).timestamp()
Réponses:
la source
calendar.timegm()
ou.toordinal()
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()
est un peu plus court.timestamp()
suppose l' heure locale au lieu de l'UTC si aucun fuseau horaire explicite n'est donné. Le code dans la réponse ne fonctionne (produit attendu1322697600
) que sur un ordinateur où le fuseau horaire local n'a aucun décalage utc.J'utilise
ciso8601
, ce qui est 62x plus rapide que le strptime de datetime.Vous pouvez en savoir plus ici .
la source
Pour convertir la chaîne en un objet date:
La façon de convertir l'objet date en horodatage POSIX dépend du fuseau horaire. De la conversion
datetime.date
en horodatage UTC en Python :l'objet date représente minuit en UTC
l'objet date représente minuit dans l'heure locale
Les horodatages sont différents sauf si minuit en UTC et en heure locale est la même instance de temps.
la source
NameError: name 'wckCalendar' is not defined
. J'exécute Python 3.4.1 sur une machine Windows 32 bits. Une idée? Merci.la source
"%s"
n'est pas pris en charge par Python . Ce n'est pas portable.La réponse dépend également de votre fuseau horaire de date d'entrée. Si votre date est une date locale, vous pouvez utiliser mktime () comme l'a dit katrielalex - seulement je ne vois pas pourquoi il a utilisé datetime au lieu de cette version plus courte:
Mais observez que mon résultat est différent du sien, car je suis probablement dans un TZ différent (et le résultat est un horodatage UNIX sans fuseau horaire)
Maintenant, si la date d'entrée est déjà en UTC, je pense que la bonne solution est:
la source
Utilisez simplement
datetime.datetime.strptime
:Résultat:
Pour utiliser UTC au lieu du fuseau horaire local, utilisez
.replace
:la source
float
nonint
Vous devez d' abord la classe strptime pour convertir la chaîne au format struct_time.
Ensuite, utilisez mktime à partir de là pour obtenir votre flotteur.
la source
Beaucoup de ces réponses ne prennent pas la peine de considérer que la date est naïve pour commencer
Pour être correct, vous devez d'abord faire de la date naïve une date / heure sensible au fuseau horaire
Aussi:
Soyez prudent, utilisez
pytz
fortzinfo
dans undatetime.datetime
NE FONCTIONNE PAS pour de nombreux fuseaux horaires. Voir datetime avec le fuseau horaire pytz. Offset différent selon la configuration de tzinfohttps://en.wikipedia.org/wiki/Local_mean_time
la source
Je suggérerais dateutil :
la source
"%d/%m/%Y"
format. Comparer:dateutil.parser.parse("01/02/2001")
etdatetime.strptime("01/02/2001", "%d/%m/%Y")
1322697600
sauf si votre fuseau horaire local est UTC. Voir mon commentaire de 2014Semble assez efficace:
1,61 µs ± 120 ns par boucle (moyenne ± écart type de 7 pistes, 100000 boucles chacune)
la source
datetime
fonction?datetime
de ladatetime
bibliothèque ne prend pas en charge.timestamp()
utilisez simplement datetime.timestamp (votre instance de datetime), l'instance de datetime contient les informations de fuseau horaire, donc l'horodatage sera un horodatage utc standard. si vous transformez le datetime en horaire, il perdra son fuseau horaire, donc le résultat sera une erreur. si vous voulez fournir une interface, vous devez écrire comme ceci: int (datetime.timestamp (time_instance)) * 1000
la source
Vous pouvez vous référer à ce lien suivant pour utiliser la
strptime
fonction dedatetime.datetime
, pour convertir la date de n'importe quel format avec le fuseau horaire.https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior
la source
vous pouvez convertir en isoformat
la source
Une fonction simple pour obtenir l'heure UNIX Epoch.
REMARQUE : Cette fonction suppose que la date et l'heure d'entrée sont au format UTC (reportez-vous aux commentaires ici).
Utilisation :
la source