代码之家  ›  专栏  ›  技术社区  ›  Sebastian Rittau

用python表示RFC 1123日期?

  •  62
  • Sebastian Rittau  · 技术社区  · 16 年前

    有没有一种简单的方法可以将日期时间对象转换成RFC1123(http/1.1)日期/时间字符串,即格式为的字符串?

    Sun, 06 Nov 1994 08:49:37 GMT
    

    使用 strftime 不起作用,因为字符串依赖于区域设置。我必须用手做绳子吗?

    5 回复  |  直到 8 年前
        1
  •  84
  •   Florian Bösch    16 年前

    可以从不依赖区域设置的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')
    

    如果不想设置区域设置过程的范围,可以使用 Babel date 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)
    
        2
  •  34
  •   Ned Batchelder    14 年前

    您可以使用python标准电子邮件模块中的formatDate()函数:

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

    以所需格式给出当前时间:

    Wed, 22 Oct 2008 10:32:33 GMT
    

    实际上,此函数是“手工”执行的,而不使用strftime()。

        3
  •  7
  •   Antoine Pinsard    8 年前

    如果有人读到这篇文章 丹戈 项目,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())
    
        4
  •  1
  •   Ignacio Vazquez-Abrams    16 年前

    您可以设置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 '
    
        5
  •  1
  •   Sebastian Rittau    16 年前

    好吧,这里有一个格式化它的手动函数:

    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)