def generate(dt, utc=True, accept_naive=False, microseconds=False):
if dt.tzinfo is None:<EOL><INDENT>if accept_naive is True:<EOL><INDENT>if utc is True:<EOL><INDENT>dt = dt.replace(tzinfo=pytz.utc)<EOL><DEDENT>else:<EOL><INDENT>raise ValueError("<STR_LIT>" +<EOL>"<STR_LIT>")<EOL><DEDENT><DEDENT>else:<EOL><INDENT>raise ValueError("<STR_LIT>")<EOL><DEDENT><DEDENT>if utc is True:<EOL><INDENT>dt = dt.astimezone(pytz.utc)<EOL><DEDENT>timestamp = dt.strftime('<STR_LIT>')<EOL>if microseconds is True:<EOL><INDENT>timestamp += dt.strftime('<STR_LIT>')<EOL><DEDENT>if dt.tzinfo is pytz.utc:<EOL><INDENT>timestamp += '<STR_LIT>'<EOL><DEDENT>else:<EOL><INDENT>timestamp += timezone(timedelta_seconds(dt.tzinfo.utcoffset(dt)))<EOL><DEDENT>return timestamp<EOL>
Generate an :RFC:`3339`-formatted timestamp from a
:class:`datetime.datetime`.

>>> from datetime import datetime
>>> generate(datetime(2009,1,1,12,59,59,0,pytz.utc))
'2009-01-01T12:59:59Z'

The timestamp will use UTC unless `utc=False` is specified, in which case
it will use the timezone from the :class:`datetime.datetime`'s
:attr:`tzinfo` parameter.

>>> eastern = pytz.timezone('US/Eastern')
>>> dt = eastern.localize(datetime(2009,1,1,12,59,59))
>>> generate(dt)
'2009-01-01T17:59:59Z'
>>> generate(dt, utc=False)
'2009-01-01T12:59:59-05:00'

Unless `accept_naive=True` is specified, the `datetime` must not be naive.

>>> generate(datetime(2009,1,1,12,59,59,0))
Traceback (most recent call last):
...
ValueError: naive datetime and accept_naive is False

>>> generate(datetime(2009,1,1,12,59,59,0), accept_naive=True)
'2009-01-01T12:59:59Z'

If `accept_naive=True` is specified, the `datetime` is assumed to be UTC.
Attempting to generate a local timestamp from a naive datetime will result
in an error.

>>> generate(datetime(2009,1,1,12,59,59,0), accept_naive=True, utc=False)
Traceback (most recent call last):
...
ValueError: cannot generate a local timestamp from a naive datetime