Thanks for the reply Rob - yup it's a string all right, but the only time *I* pass anything to rfc3399 is when I pass it a datetime.datetime object.
It seems that the routine feedgenerator.writeString is sending rfc3399 a string rather than a datetime.datetime object, which it gets from the write method of Atom1Feed - the relevant bit is here... handler.addQuickElement(u"updated", rfc3339_date(self.latest_post_date()).decode('ascii')) Which leads to this (with my debug prints); def latest_post_date(self): """ Returns the latest item's pubdate. If none of them have a pubdate, this returns the current date/time. """ updates = [i['pubdate'] for i in self.items if i['pubdate'] is not None] print "UPDATES", updates if len(updates) > 0: updates.sort() print "updates:", type(updates[-1]) return updates[-1] else: print "datetime.datetime.now()", datetime.datetime.now() return datetime.datetime.now() What happens now? Well, this; UPDATES ['2005-11-25T11:51:01Z'] updates: <type 'str'> Which leads to the blow-up. I would have thought that other people would have seen this which is why I re-iterate "what stupid thing am I doing here?" ;) many thanks Tone