web-dev-qa-db-ja.com

RFC 1123 Pythonでの日付表現?

日付時刻オブジェクトをRFC 1123(HTTP/1.1)日付時刻文字列、つまり次の形式の文字列に変換するかなり簡単な方法はありますか

Sun, 06 Nov 1994 08:49:37 GMT

文字列はロケールに依存するため、strftimeを使用しても機能しません。文字列を手作業で作成する必要がありますか?

63

ロケール設定に依存しないstdlibからwsgiref.handlers.format_date_timeを使用できます

from wsgiref.handlers import format_date_time
from datetime import datetime
from time import mktime

now = datetime.now()
stamp = mktime(now.timetuple())
print format_date_time(stamp) #--> Wed, 22 Oct 2008 10:52:40 GMT

ロケール設定に依存しないstdlibのemail.utils.formatdateを使用できます

from email.utils import formatdate
from datetime import datetime
from time import mktime

now = datetime.now()
stamp = mktime(now.timetuple())
print formatdate(
    timeval     = stamp,
    localtime   = False,
    usegmt      = True
) #--> Wed, 22 Oct 2008 10:55:46 GMT

ロケールプロセスを広く設定できる場合は、次のようにできます。

import locale, datetime

locale.setlocale(locale.LC_TIME, 'en_US')
datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')

ロケールプロセス全体を設定したくない場合は、 Babeldate formating を使用できます。

from datetime import datetime
from babel.dates import format_datetime

now = datetime.utcnow()
format = 'EEE, dd LLL yyyy hh:mm:ss'
print format_datetime(now, format, locale='en') + ' GMT'

Wsgiref.handlers.format_date_timeと同じ手動でフォーマットする方法は次のとおりです。

def httpdate(dt):
    """Return a string representation of a date according to RFC 1123
    (HTTP/1.1).

    The supplied date must be in UTC.

    """
    weekday = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][dt.weekday()]
    month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep",
             "Oct", "Nov", "Dec"][dt.month - 1]
    return "%s, %02d %s %04d %02d:%02d:%02d GMT" % (weekday, dt.day, month,
        dt.year, dt.hour, dt.minute, dt.second)
84
Florian Bösch

Python標準メールモジュールからのformatdate()関数を使用できます:

from email.utils import formatdate
print formatdate(timeval=None, localtime=False, usegmt=True)

現在の時刻を目的の形式で示します。

Wed, 22 Oct 2008 10:32:33 GMT

実際、この関数はstrftime()を使用せずに「手動」で実行します

35
Ber

これを読んでいる人がDjangoプロジェクトで作業している場合、Djangoは関数 Django.utils.http.http_date(Epoch_seconds)

from Django.utils.http import http_date

some_datetime = some_object.last_update
response['Last-Modified'] = http_date(some_datetime.timestamp())
10
Antoine Pinsard

LC_TIMEを設定して、stftime()が特定のロケールを使用するように強制できます。

>>> locale.setlocale(locale.LC_TIME, 'en_US')
'en_US'
>>> datetime.datetime.now().strftime(locale.nl_langinfo(locale.D_T_FMT))
'Wed 22 Oct 2008 06:05:39 AM '

まあ、これはそれをフォーマットするための手動関数です:

def httpdate(dt):
    """Return a string representation of a date according to RFC 1123
    (HTTP/1.1).

    The supplied date must be in UTC.

    """
    weekday = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][dt.weekday()]
    month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep",
             "Oct", "Nov", "Dec"][dt.month - 1]
    return "%s, %02d %s %04d %02d:%02d:%02d GMT" % (weekday, dt.day, month,
        dt.year, dt.hour, dt.minute, dt.second)
1