381 Stimmen

Konvertierung von datetime.date in UTC-Zeitstempel in Python

Ich befasse mich mit Daten in Python und ich brauche, um sie in UTC-Zeitstempel zu konvertieren, verwendet werden in Javascript zu verwenden. Der folgende Code funktioniert nicht:

>>> d = datetime.date(2011,01,01)
>>> datetime.datetime.utcfromtimestamp(time.mktime(d.timetuple()))
datetime.datetime(2010, 12, 31, 23, 0)

Auch die Konvertierung des Datumsobjekts in datetime hilft nicht. Ich habe das Beispiel unter diesem Link ausprobiert Link aus, sondern:

from pytz import utc, timezone
from datetime import datetime
from time import mktime
input_date = datetime(year=2011, month=1, day=15)

und jetzt entweder:

mktime(utc.localize(input_date).utctimetuple())

o

mktime(timezone('US/Eastern').localize(input_date).utctimetuple())

funktioniert.

Also allgemeine Frage: wie kann ich ein Datum in Sekunden seit der Epoche nach UTC umrechnen lassen?

6voto

kev Punkte 145226

Ein vollständiger Zeitstrang enthält:

  • Datum
  • Zeit
  • utcoffset [+HHMM or -HHMM]

Zum Beispiel:

1970-01-01 06:00:00 +0500 \== 1970-01-01 01:00:00 +0000 \== UNIX timestamp:3600

$ python3
>>> from datetime import datetime
>>> from calendar import timegm
>>> tm = '1970-01-01 06:00:00 +0500'
>>> fmt = '%Y-%m-%d %H:%M:%S %z'
>>> timegm(datetime.strptime(tm, fmt).utctimetuple())
3600

Nota:

UNIX timestamp ist eine Gleitkommazahl, ausgedrückt in Sekunden seit der Epoche, in UTC .


Bearbeiten:

$ python3
>>> from datetime import datetime, timezone, timedelta
>>> from calendar import timegm
>>> dt = datetime(1970, 1, 1, 6, 0)
>>> tz = timezone(timedelta(hours=5))
>>> timegm(dt.replace(tzinfo=tz).utctimetuple())
3600

3voto

Mathieu Longtin Punkte 14697

Die Verwendung des Pfeil Paket:

>>> import arrow
>>> arrow.get(2010, 12, 31).timestamp
1293753600
>>> time.gmtime(1293753600)
time.struct_time(tm_year=2010, tm_mon=12, tm_mday=31, 
    tm_hour=0, tm_min=0, tm_sec=0, 
    tm_wday=4, tm_yday=365, tm_isdst=0)

3voto

Max Punkte 767

Wenn man bedenkt, dass Sie eine datetime Objekt namens d , verwenden Sie Folgendes, um den Zeitstempel in UTC zu erhalten:

d.strftime("%Y-%m-%dT%H:%M:%S.%fZ")

Für die umgekehrte Richtung verwenden Sie Folgendes:

d = datetime.strptime("2008-09-03T20:56:35.450686Z", "%Y-%m-%dT%H:%M:%S.%fZ")

2voto

andrew cooke Punkte 43891

Die Frage ist ein wenig verwirrt. Zeitstempel sind nicht UTC - sie sind eine Unix-Sache. das Datum könnte UTC sein? angenommen, es ist, und wenn Sie Python 3.2+ verwenden, einfaches-datum macht dies trivial:

>>> SimpleDate(date(2011,1,1), tz='utc').timestamp
1293840000.0

Wenn Sie das Jahr, den Monat und den Tag tatsächlich haben, brauchen Sie nicht die date :

>>> SimpleDate(2011,1,1, tz='utc').timestamp
1293840000.0

und wenn das Datum in einer anderen Zeitzone liegt (das ist wichtig, weil wir davon ausgehen, dass Mitternacht ohne zugehörige Zeit):

>>> SimpleDate(date(2011,1,1), tz='America/New_York').timestamp
1293858000.0

[Die Idee hinter simple-date ist es, alle python's date and time stuff in einer konsistenten Klasse zu sammeln, so dass man jede Konvertierung machen kann. so, zum Beispiel, wird es auch in die andere Richtung gehen:

>>> SimpleDate(1293858000, tz='utc').date
datetime.date(2011, 1, 1)

]

1voto

bbartling Punkte 2975

Das funktioniert bei mir, wenn man eine Funktion durchläuft.

from datetime import timezone, datetime, timedelta 
import datetime

def utc_converter(dt):
    dt = datetime.datetime.now(timezone.utc)
    utc_time = dt.replace(tzinfo=timezone.utc)
    utc_timestamp = utc_time.timestamp()
    return utc_timestamp

# create start and end timestamps
_now = datetime.datetime.now()
str_start = str(utc_converter(_now))
_end = _now + timedelta(seconds=10)
str_end = str(utc_converter(_end))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X