name - Convertir datetime de Python a rfc 2822
python time monotonic (3)
Aquí hay un código de trabajo, dividido en partes simples para mayor claridad:
>>> import datetime
>>> import time
>>> from email import utils
>>> nowdt = datetime.datetime.now()
>>> nowtuple = nowdt.timetuple()
>>> nowtimestamp = time.mktime(nowtuple)
>>> utils.formatdate(nowtimestamp)
''Tue, 10 Aug 2010 20:43:53 -0000''
Explicación: email.utils.formatdate
quiere una marca de tiempo, es decir, un flotador con segundos (y una fracción de eso) desde la época. Una instancia de datetime
no le da una marca de hora directamente, pero puede darle una tupla de tiempo con el método de la timetuple
, y time.mktime
por supuesto, puede hacer una marca de hora de esa tupla.
Quiero convertir un datetime de Python en un datetime de RFC 2822. He intentado estos métodos en vano:
>>> from email.Utils import formatdate
>>> import datetime
>>> formatdate(datetime.datetime.now())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/email /utils.py", line 159, in formatdate
now = time.gmtime(timeval)
TypeError: a float is required
Python 3.3, además de los métodos mencionados por otros comentaristas, también agregó un método format_datetime
, que es mucho más limpio:
>>> import datetime
>>> import email.utils
>>> dt = datetime.datetime.now()
>>> email.utils.format_datetime(dt)
''Thu, 09 Mar 2017 10:50:00 -0000''
Si realmente desea la hora actual, solo tiene que llamar formatdate
sin argumentos:
>>> from email.Utils import formatdate
>>> formatdate()
''Tue, 10 Aug 2010 20:40:23 -0000''
Pero, si debe pasarle un argumento, desea la salida de time.time
(unos segundos desde 01/01/1970):
>>> import time
>>> formatdate(time.time())
''Tue, 10 Aug 2010 20:41:43 -0000''
FWIW, datetime.datetime.now()
devuelve un objeto datetime
, que no es lo que espera formatdate
.
Editado para agregar: si ya tiene un objeto de fecha y hora, puede formatearlo adecuadamente para formatdate:
>>> import datetime
>>> dt = datetime.datetime.now()
>>> formatdate(float(dt.strftime(''%s'')))
''Tue, 10 Aug 2010 20:46:16 -0000''
Editado: Alex Martelli observó que la cadena de formato ''% s'' para strftime puede no ser portátil en todas las plataformas. Una posible alternativa sería, como él mismo sugirió,
>>> formatdate(time.mktime(dt.timetuple()))
''Tue, 10 Aug 2010 20:46:16 -0000''