34

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
4

5 に答える 5

47

わかりやすくするために、いくつかの実用的なコードを簡単な部分に分解します。

>>> 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'

説明:email.utils.formatdateタイムスタンプが必要です。つまり、エポックからの秒数(およびその一部)を含むフロートが必要です。datetimeインスタンスはタイムスタンプを直接提供しませんが、メソッドを使用してタイムタプルを提供できますもちろん、そのようなタプルからタイムスタンプを作成できます。timetupletime.mktime

編集:Python 3.3以降では、同じことをより少ない手順で実行できます。

>>> import datetime
>>> from email import utils
>>> nowdt = datetime.datetime.now()
>>> utils.format_datetime(nowdt)
'Tue, 10 Feb 2020 10:06:53 -0000'

format_datetime 使用法の詳細については、ドキュメントを参照してください。

于 2010-08-10T20:45:28.083 に答える
27

本当に現在の時刻が必要な場合は、formatdate引数なしで呼び出すだけです。

>>> from email.utils import formatdate
>>> formatdate()
'Tue, 10 Aug 2010 20:40:23 -0000'

ただし、引数を渡す必要がある場合は、time.time(1970年1月1日からの秒数)の出力が必要です。

>>> import time
>>> formatdate(time.time())
'Tue, 10 Aug 2010 20:41:43 -0000'

FWIWはオブジェクトをdatetime.datetime.now()返しますが、これは期待したものではありません。datetimeformatdate

追加するために編集:datetimeオブジェクトがすでにある場合は、formatdateに合わせて適切にフォーマットできます。

>>> import datetime
>>> dt = datetime.datetime.now()
>>> formatdate(float(dt.strftime('%s')))
'Tue, 10 Aug 2010 20:46:16 -0000'

編集:Alex Martelliは、strftimeの「%s」フォーマット文字列はプラットフォーム間で移植できない可能性があると述べました。考えられる代替案は、彼自身が示唆したように、

>>> formatdate(time.mktime(dt.timetuple()))
'Tue, 10 Aug 2010 20:46:16 -0000'
于 2010-08-10T20:43:44.643 に答える