I need to print the FULL local date/time in ISO 8601 format, including the local timezone info, eg:
2007-04-05T12:30:00.0000-02:00
I can use datetime.isoformat()
to print it, if I have the right tzinfo object - but how do I get that?
Note, I'm stuck at Python 2.5, which may reduce some availability of options.
The python standard library does not provide tzinfo implementation. You need to subclass it. examples are provided in the datetime module.
The accepted answer provide wrong results. For example in my timezone +02, the result is +01:59. This is because microsecond replacement to 0 needs to be done on localnow and utcnow before the difference is calculated.
Here a version of mine for python 2.5:
# coding=utf-8def isoformat_offset(dt, offset, dt_sep='T', hm_sep=True, short=True):"""Return a string representing the date and time in ISO 8601 format,YYYY-MM-DDTHH:MM:SS.mmmmmm+HH:MM. If microseconds is 0 .mmmmmm is omitted.The optional argument dt_sep (default 'T') is a one-character separator,placed between the date and time portions of the result.The optional argument hm_Sep (default True) indicates if a : separatorshould be placed between the hours and minutes portions of the time zonedesignator.The optional argument short (default True) defines if the minute portion ofthe time zone designator should be omitted in the case of zero minutes.>>> from datetime import datetime>>> cur = datetime(2017, 4, 26, 17, 14, 23, 123456)>>> off = 2 * 3600 # +02:00>>> isoformat_offset(cur, off)'2017-04-26T17:14:23.123456+02'>>> isoformat_offset(cur, off, ' ')'2017-04-26 17:14:23.123456+02'>>> isoformat_offset(cur, off, hm_sep=False)'2017-04-26T17:14:23.123456+02'>>> isoformat_offset(cur, off, short=False)'2017-04-26T17:14:23.123456+02:00'>>> isoformat_offset(cur, off, hm_sep=False, short=False)'2017-04-26T17:14:23.123456+0200'>>> cur = cur.replace(microsecond=0)>>> isoformat_offset(cur, off)'2017-04-26T17:14:23+02'>>> off = -2 * 3600 # -02:00>>> isoformat_offset(cur, off)'2017-04-26T17:14:23-02'>>> off = 2 * 3600 + 30 * 60 # +02:30>>> isoformat_offset(cur, off)'2017-04-26T17:14:23+02:30'>>> isoformat_offset(cur, off, hm_sep=False)'2017-04-26T17:14:23+0230'"""offset_hours = offset // 3600offset_mins = (offset - offset_hours * 3600) // 60frmt = '%s%+03d'args = [dt.isoformat(dt_sep), offset_hours]if (short is True and offset_mins > 0) or (short is False and offset_mins == 0):if hm_sep is True:frmt += ':'frmt += '%02d'args.append(offset_mins)return frmt % tuple(args)if __name__ == '__main__':import doctestdoctest.testmod()
To get the local timezone in seconds as need for this function, use negated altzone from time module:
from datetime import datetime
import timenow = datetime.now()
offset = -time.altzone
print(isoformat_offset(now, offset))