Se d = date(2011, 1, 1)
estiver no UTC:
>>> from datetime import datetime, date
>>> import calendar
>>> timestamp1 = calendar.timegm(d.timetuple())
>>> datetime.utcfromtimestamp(timestamp1)
datetime.datetime(2011, 1, 1, 0, 0)
Se d
estiver no fuso horário local:
>>> import time
>>> timestamp2 = time.mktime(d.timetuple()) # DO NOT USE IT WITH UTC DATE
>>> datetime.fromtimestamp(timestamp2)
datetime.datetime(2011, 1, 1, 0, 0)
timestamp1
e timestamp2
pode diferir se meia-noite no fuso horário local não for a mesma instância de hora que meia-noite no UTC.
mktime()
pode retornar um resultado errado se d
corresponder a um horário local ambíguo (por exemplo, durante a transição do horário de verão) ou se d
for uma data passada (futura) em que o deslocamento utc possa ter sido diferente e o C mktime()
não tenha acesso ao banco de dados tz na plataforma fornecida . Você pode usar o pytz
módulo (por exemplo, via tzlocal.get_localzone()
) para obter acesso ao banco de dados tz em todas as plataformas . Além disso, utcfromtimestamp()
pode falhar e mktime()
pode retornar o carimbo de data / hora não POSIX se o "right"
fuso horário for usado .
Para converter um datetime.date
objeto que representa a data no UTC sem calendar.timegm()
:
DAY = 24*60*60 # POSIX day in seconds (exact value)
timestamp = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * DAY
timestamp = (utc_date - date(1970, 1, 1)).days * DAY
Como posso converter uma data em segundos desde a época, de acordo com o UTC?
Converter datetime.datetime
(não datetime.date
) o objeto que já representa a hora no UTC no carimbo de data / hora POSIX correspondente (a float
).
Python 3.3 ou superior
datetime.timestamp()
:
from datetime import timezone
timestamp = dt.replace(tzinfo=timezone.utc).timestamp()
Nota: É necessário fornecer timezone.utc
explicitamente, caso contrário, .timestamp()
suponha que seu objeto de data e hora ingênuo esteja no fuso horário local.
Python 3 (<3.3)
Dos documentos para datetime.utcfromtimestamp()
:
Não existe um método para obter o registro de data e hora de uma instância de data e hora, mas o registro de data e hora POSIX correspondente a uma instância de data e hora dt pode ser facilmente calculado da seguinte maneira. Para um dt ingênuo:
timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)
E para um dt consciente:
timestamp = (dt - datetime(1970,1,1, tzinfo=timezone.utc)) / timedelta(seconds=1)
Leitura interessante: época da época versus hora do dia sobre a diferença entre Que horas são? e Quantos segundos se passaram?
Consulte também: datetime precisa de um método de "época"
Python 2
Para adaptar o código acima para Python 2:
timestamp = (dt - datetime(1970, 1, 1)).total_seconds()
Onde timedelta.total_seconds()
é equivalente ao (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
calculado com a divisão verdadeira ativada.
from __future__ import division
from datetime import datetime, timedelta
def totimestamp(dt, epoch=datetime(1970,1,1)):
td = dt - epoch
# return td.total_seconds()
return (td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**6
now = datetime.utcnow()
print now
print totimestamp(now)
Cuidado com com problemas de ponto flutuante .
Resultado
2012-01-08 15:34:10.022403
1326036850.02
Como converter um datetime
objeto consciente em carimbo de data / hora POSIX
assert dt.tzinfo is not None and dt.utcoffset() is not None
timestamp = dt.timestamp() # Python 3.3+
No Python 3:
from datetime import datetime, timedelta, timezone
epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
timestamp = (dt - epoch) / timedelta(seconds=1)
integer_timestamp = (dt - epoch) // timedelta(seconds=1)
No Python 2:
# utc time = local time - utc offset
utc_naive = dt.replace(tzinfo=None) - dt.utcoffset()
timestamp = (utc_naive - datetime(1970, 1, 1)).total_seconds()