Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RFC 1123 Date Representation in Python?

Is there a fairly easy way to convert a datetime object into an RFC 1123 (HTTP/1.1) date/time string, i.e. a string with the format

Sun, 06 Nov 1994 08:49:37 GMT 

Using strftime does not work, since the strings are locale-dependant. Do I have to build the string by hand?

like image 498
Sebastian Rittau Avatar asked Oct 22 '08 09:10

Sebastian Rittau


People also ask

How are dates represented in Python?

The date class is used to instantiate date objects in Python. When an object of this class is instantiated, it represents a date in the format YYYY-MM-DD.

How do I format a date in YYYY-MM-DD in Python?

In Python, we can easily format dates and datetime objects with the strftime() function. For example, to format a date as YYYY-MM-DD, pass “%Y-%m-%d” to strftime(). If you want to create a string that is separated by slashes (“/”) instead of dashes (“-“), pass “%Y/%m/%d” to strftime().

How do I convert number to date Python?

You can use the fromtimestamp function from the datetime module to get a date from a UNIX timestamp. This function takes the timestamp as input and returns the datetime object corresponding to the timestamp.


1 Answers

You can use wsgiref.handlers.format_date_time from the stdlib which does not rely on locale settings

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 

You can use email.utils.formatdate from the stdlib which does not rely on locale settings

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 

If you can set the locale process wide then you can do:

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

If you don't want to set the locale process wide you could use 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' 

A manual way to format it which is identical with wsgiref.handlers.format_date_time is:

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) 
like image 111
Florian Bösch Avatar answered Sep 21 '22 20:09

Florian Bösch