将 Python 日期时间转换为 rfc 2822
我想将 Python 日期时间转换为 RFC 2822 日期时间。我尝试过这些方法均无效:
>>> 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
I want to convert a Python datetime to an RFC 2822 datetime. I've tried these methods to no avail:
>>> 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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
下面是一些工作代码,为了清楚起见,将其分解为简单的部分:
说明:
email.utils.formatdate
需要一个时间戳——即自纪元以来包含秒数(及其小数部分)的浮点数。datetime
实例不会直接为您提供时间戳 - 但是,它可以使用timetuple
方法为您提供时间元组,并且time.mktime
当然可以从这样的元组中创建时间戳。编辑:在 Python 3.3 及更高版本中,您可以通过更少的步骤执行相同的操作:
请参阅
format_datetime
docs 了解有关使用的详细信息。Here's some working code, broken down into simple pieces just for clarity:
Explanation:
email.utils.formatdate
wants a timestamp -- i.e., a float with seconds (and fraction thereof) since the epoch. Adatetime
instance doesn't give you a timestamp directly -- but, it can give you a time-tuple with thetimetuple
method, andtime.mktime
of course can then make a timestamp from such a tuple.EDIT: In Python 3.3 and newer you can do the same in less steps:
See
format_datetime
docs for details on usage.如果您确实想要当前时间,只需调用不带参数的
formatdate
即可:但是,如果您必须向其传递参数,则需要
time.time
的输出(一个数字自 01/01/1970 以来的秒数):FWIW,
datetime.datetime.now()
返回一个datetime
对象,这不是formatdate
期望。编辑添加:如果您已经有一个 datetime 对象,则可以将其格式化为 formatdate:
编辑:Alex Martelli 指出 strftime 的“%s”格式字符串可能无法跨平台移植。正如他本人所建议的,一个可能的替代方案是:
If you indeed want the current time, just call
formatdate
with no arguments:But, if you must pass it an argument, you want the output of
time.time
(a number of seconds since 01/01/1970):FWIW,
datetime.datetime.now()
returns adatetime
object, which is not whatformatdate
expects.Edited to add: if you already have a datetime object, you can format it appropriately for formatdate:
Edited: Alex Martelli noted that the '%s' format string for strftime may not be portable across platforms. A possible alternative would be, as he himself suggested,
Python 3.3除了其他评论者提到的方法之外,还添加了一个
format_datetime
方法,该方法更加简洁:Python 3.3, in addition to the methods mentioned by other commenters, also added a
format_datetime
method, which is much cleaner:使用 strftime 的简单方法。 Python 2.7。注意:时区 = EST
Simple method using strftime. Python 2.7. Note: timezone = EST
如果您将此用于 HTTP 标头,并且需要
GMT
而不是-0000
:从
datetime
,请使用 <代码>format_datetime(强调我的):<块引用>
如果它是偏移量为零的感知时区,则 usegmt 可能会设置为
True
,在这种情况下,使用字符串GMT
而不是数字时区偏移。
<前><代码>>>>从日期时间导入日期时间、时区
>>>>>从 email.utils 导入 format_datetime
>>>>> format_datetime(datetime.now(timezone.utc), usegmt=True)
'2021 年 10 月 27 日星期三 11:00:46 GMT'
从时间戳中,使用
formatdate
:<块引用>
可选usegmt是一个标志,当
True
时,输出日期字符串时区为 ascii 字符串
GMT
,而不是数字-0000
...仅当本地时间为False
时才适用。<前><代码>>>>从 email.utils 导入格式日期
>>>>>从导入时间开始
>>>>>格式日期(时间(),usegmt=True)
'2021 年 10 月 27 日星期三 11:05:29 GMT'
If you're using this for e.g. a HTTP header, and want
GMT
rather than-0000
:From a
datetime
, useformat_datetime
(emphasis mine):From a timestamp, use
formatdate
: