Convert python datetime naar epoch met strftime

Ik heb een tijd in UTC waarvan ik het aantal seconden sinds epoch wil weten.

Ik gebruik strftime om het om te zetten naar het aantal seconden. Neem 1 april 2012 als voorbeeld.

>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'

1 april 2012 UTC van tijdperk is 1333238400, maar dit hierboven geeft 1333234800 terug, wat 1 uur anders is.

Dus het lijkt erop dat strftime rekening houdt met mijn systeemtijd en ergens een tijdzoneverschuiving toepast. Ik dacht dat datetime puur naïef was?

Hoe kan ik dat omzeilen? Vermijd indien mogelijk het importeren van andere bibliotheken, tenzij standaard. (Ik heb zorgen over draagbaarheid).


Antwoord 1, autoriteit 100%

Als je een python datetime wilt converteren naar seconden sinds epoche, kun je dit expliciet doen:

>>> (datetime.datetime(2012,04,01,0,0) - datetime.datetime(1970,1,1)).total_seconds()
1333238400.0

In Python 3.3+ kun je timestamp()in plaats daarvan:

>>> datetime.datetime(2012,4,1,0,0).timestamp()
1333234800.0

Waarom u datetime.strftime('%s')

niet moet gebruiken

Python ondersteunt %s niet echt als argument voor strftime (als je kijkt op http://docs.python.org/library/datetime.html#strftime-and-strptime-behaviorhet staat niet in de lijst), de enige reden waarom het werkt is omdat Python voorbij komt de informatie naar de strftime van uw systeem, die uw lokale tijdzone gebruikt.

>>> datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'

Antwoord 2, autoriteit 22%

Ik had ernstige problemen met tijdzones en dergelijke. De manier waarop Python dat allemaal afhandelt, is behoorlijk verwarrend (voor mij). Het lijkt goed te werken met de kalendermodule (zie links 1, 2, 3en 4).

>>> import datetime
>>> import calendar
>>> aprilFirst=datetime.datetime(2012, 04, 01, 0, 0)
>>> calendar.timegm(aprilFirst.timetuple())
1333238400

Antwoord 3, autoriteit 8%

import time
from datetime import datetime
now = datetime.now()
time.mktime(now.timetuple())

Antwoord 4, autoriteit 3%

import time
from datetime import datetime
now = datetime.now()
# same as above except keeps microseconds
time.mktime(now.timetuple()) + now.microsecond * 1e-6

(Sorry, ik kan niet reageren op een bestaand antwoord)


Antwoord 5

als je alleen een tijdstempel in unix /epoch-tijd nodig hebt, werkt deze regel:

created_timestamp = int((datetime.datetime.now() - datetime.datetime(1970,1,1)).total_seconds())
>>> created_timestamp
1522942073L

en hangt alleen af van datetime
werkt in python2 en python3


Antwoord 6

Gebruik de pytz-bibliotheek voor een expliciete tijdzone-onafhankelijke oplossing.

import datetime
import pytz
pytz.utc.localize(datetime.datetime(2012,4,1,0,0), is_dst=False).timestamp()

Uitvoer (float): 1333238400.0


Antwoord 7

Dit werkt in Python 2 en 3:

>>> import time
>>> import calendar
>>> calendar.timegm(time.gmtime())
1504917998

Gewoon de officiële documenten volgen…
https://docs.python.org/2/library/time. html#module-tijd


Antwoord 8

In Python 3.7

Retourneer een datetime die overeenkomt met een date_string in een van de formaten
uitgezonden door date.isoformat() en datetime.isoformat(). specifiek,
deze functie ondersteunt strings in de indeling(en)
JJJJ-MM-DD[*UU[:MM[:SS[.fff[fff]]]][+UU:MM[:SS[.ffffff]]]], waarbij *
kan overeenkomen met elk afzonderlijk teken.

https://docs.python.org/3 /library/datetime.html#datetime.datetime.fromisoformat

Other episodes