example - Python datetime.utcnow() devuelve datetime incorrecto
strftime python (3)
El problema solo ocurre con utc time (Python3).
Por ejemplo, hora del sistema:
$ date
Wed Jul 15 10:44:26 BST 2015
Tiempo de Python correcto cuando se usa datetime.now ():
>>> datetime.now()
datetime.datetime(2015, 7, 15, 10, 44, 30, 775840)
... Pero incorrecto en una hora cuando se usa datetime.utcnow ():
>>> datetime.utcnow()
datetime.datetime(2015, 7, 15, 9, 44, 32, 599823)
El problema de UTC es que no conoce mi zona horaria.
Tienes que decirlo, con la ayuda de un módulo de zona horaria llamado pytz:
>>> import pytz
>>> mytz = pytz.timezone(''Europe/London'')
>>> pytz.utc.localize(datetime.utcnow(), is_dst=None).astimezone(mytz)
datetime.datetime(2015, 7, 15, 11, 3, 43, 688681, tzinfo=<DstTzInfo ''Europe/London'' BST+1:00:00 DST>)
Referencias
pytz - Convertir UTC y zona horaria a hora local
http://sweemengs-tech-world.blogspot.co.uk/2010/05/get-correct-datetime-value-for-python.html
datetime.utcnow()
Esta llamada está devolviendo una fecha y hora incorrecta, retrasada desde UTC / GMT por 1 hora (consulte: http://www.worldtimeserver.com/current_time_in_UTC.asp ).
¿Funciona como debería ser?
Por ejemplo, está regresando, en este momento:
2015-02-17 23:58:44.761000.
La hora actual UTC es: 00:58, no 23:58
Sé que estoy tremendamente tarde en responder a esto.
He intentado hacer esto recientemente y, por lo tanto, sugiero usar
datetime.now()
lugar de
datetime.utcnow()
.
Para mi aplicación simple que funciona bien.
datetime.utcnow()
usa los valores proporcionados por el sistema operativo.
datetime.utcnow()
usa
gettimeofday(2)
o
time.time()
en Python 2 (y
gmtime(3)
para convertir el resultado en tiempo desglosado).
time.time()
usa
gettimeofday(2)
,
ftime(3)
,
time(2)
.
Las versiones más recientes de CPython pueden usar
clock_gettime(2)
,
GetSystemTimeAsFileTime()
.
Puede verificar la autoconsistencia de la siguiente manera:
#!/usr/bin/env python
import time
from datetime import datetime, timedelta
print(datetime.utcnow())
print(datetime(1970, 1, 1) + timedelta(seconds=time.time()))
print(datetime(*time.gmtime()[:6]))
Aquí hay un código (no probado) que llama a
GetSystemTimeAsFileTime()
en Windows
basado en la fuente CPython
:
#!/usr/bin/env python
import ctypes.wintypes
from datetime import datetime, timedelta
def utcnow_microseconds():
system_time = ctypes.wintypes.FILETIME()
ctypes.windll.kernel32.GetSystemTimeAsFileTime(ctypes.byref(system_time))
large = (system_time.dwHighDateTime << 32) + system_time.dwLowDateTime
return large // 10 - 11644473600000000
print(datetime(1970, 1, 1) + timedelta(microseconds=utcnow_microseconds()))
Aquí hay un código que llama a
clock_gettime()
en Python 2
.