Go to content

Generate RSS in JSP? Set the locale!

Published on

The RSS pubDate fields contain dates in a format that may be human readable, but not very handy in a programmer’s point of view. According to the RSS specification the date must conform to the RFC822 specification. A typical RSS snippet looks like:

  <title>Generate RSS in JSP? Set the locale!</title>
  <description><p>Description of the feed item</p></description>
  <pubDate>Wed, 10 Dec 2009 09:55:00 +0100</pubDate>

A way to format a java.util.Date in JSP is using the fmt library from JSTL.

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    <![CDATA[<hst:html hippohtml="${item.html}"/>]]>
    <fmt:formatDate value="${item.date.time}" 
                    pattern="EE, dd MMM yyyy HH:mm:ss Z"/>

This seems to look good when you request the RSS feed from your browser. However when you request the same feed from a Java (ROME), a request generator (Fiddler) or just use wget the format of the pubDate field is invalid. It returns Wed Dec 10 09:55:00 CET 2009 instead of Wed, 10 Dec 2009 09:55:00 +0100 as value of pubDate. What happened?

Your browser sends a header Accept-Language with, hopefully, en-US as first value. The JSTL library uses the en-US locale to format the date and the feed gets parsed correctly. The other tools don’t send this header and the programmer did not specify a locale for fmt. fmt does not know how to format the date and returns a Date.getString();.

A workaround for you as requester of the feed is to manually add the "Accept-Language" header to the request with value en-US. For the JSP developer: the date format for RSS should always be en_US. Just add this line to your JSP:

<fmt:setLocale value="en_US"/>